O'zbek

TypeScript generiklarining ilg'or usullarini o'rganing: cheklovlar, yordamchi tiplar, tipni avtomatik aniqlash va global miqyosda mustahkam va qayta ishlatiladigan kod yozish uchun amaliy qo'llanmalar.

TypeScript Generics: Ilg'or foydalanish usullari

TypeScript generiklari moslashuvchan, qayta ishlatiladigan va tip xavfsizligi yuqori bo'lgan kod yozish imkonini beruvchi kuchli xususiyatdir. Ular kompilyatsiya vaqtida tip tekshiruvini saqlab qolgan holda turli xil tiplar bilan ishlay oladigan tiplarni aniqlash imkonini beradi. Ushbu blog posti, geografik joylashuvi yoki kelib chiqishidan qat'i nazar, barcha darajadagi dasturchilar uchun amaliy misollar va tushunchalarni taqdim etib, ilg'or foydalanish usullarini chuqur o'rganadi.

Asoslarni tushunish: Qisqacha takrorlash

Ilg'or mavzularga sho'ng'ishdan oldin, keling, asoslarni tezda takrorlab olaylik. Generiklar bitta tip o'rniga turli xil tiplar bilan ishlay oladigan komponentlar yaratish imkonini beradi. Siz funksiya yoki sinf nomidan keyin burchakli qavslar (`<>`) ichida umumiy tip parametrini e'lon qilasiz. Bu parametr keyinchalik funksiya yoki sinf ishlatilganda ko'rsatiladigan haqiqiy tip uchun o'rin egallovchi vazifasini bajaradi.

Masalan, oddiy generik funksiya quyidagicha ko'rinishi mumkin:

function identity(arg: T): T {
  return arg;
}

Bu misolda T umumiy tip parametri hisoblanadi. identity funksiyasi T tipidagi argumentni qabul qiladi va T tipidagi qiymatni qaytaradi. Keyin siz bu funksiyani turli tiplar bilan chaqirishingiz mumkin:


let stringResult: string = identity("hello");
let numberResult: number = identity(42);

Ilg'or Generiklar: Asoslardan tashqari

Endi generiklardan foydalanishning yanada murakkab usullarini ko'rib chiqamiz.

1. Umumiy Tip Cheklovlari

Tip cheklovlari umumiy tip parametri bilan ishlatilishi mumkin bo'lgan tiplarni cheklash imkonini beradi. Bu generik tipning ma'lum xususiyatlarga yoki metodlarga ega ekanligini ta'minlash kerak bo'lganda juda muhimdir. Cheklovni belgilash uchun extends kalit so'zidan foydalanishingiz mumkin.

Funksiya length xususiyatiga kirishini xohlagan misolni ko'rib chiqing:

function loggingIdentity(arg: T): T {
  console.log(arg.length);
  return arg;
}

Bu misolda T number tipidagi length xususiyatiga ega bo'lgan tiplar bilan cheklangan. Bu bizga arg.length ga xavfsiz kirish imkonini beradi. Ushbu cheklovni qondirmaydigan tipni uzatishga harakat qilish kompilyatsiya vaqtida xatolikka olib keladi.

Global qo'llanilishi: Bu, ayniqsa, massivlar yoki satrlar bilan ishlash kabi ma'lumotlarni qayta ishlash bilan bog'liq stsenariylarda foydalidir, chunki sizga ko'pincha uzunlikni bilish kerak bo'ladi. Bu usul sizning Tokio, London yoki Rio-de-Janeyroda ekanligingizdan qat'i nazar, bir xil ishlaydi.

2. Interfeyslar bilan Generiklardan foydalanish

Generiklar interfeyslar bilan muammosiz ishlaydi, bu sizga moslashuvchan va qayta ishlatiladigan interfeys ta'riflarini yaratish imkonini beradi.

interface GenericIdentityFn {
  (arg: T): T;
}

function identity(arg: T): T {
  return arg;
}

let myIdentity: GenericIdentityFn = identity;

Bu yerda GenericIdentityFn — bu T umumiy tipini qabul qiluvchi va o'sha T tipini qaytaruvchi funksiyani tavsiflovchi interfeys. Bu sizga tip xavfsizligini saqlagan holda turli xil tip imzolariga ega funksiyalarni aniqlash imkonini beradi.

Global nuqtai nazar: Bu usul har xil turdagi obyektlar uchun qayta ishlatiladigan interfeyslarni yaratishga imkon beradi. Masalan, siz turli API-lar bo'ylab ishlatiladigan ma'lumotlar uzatish obyektlari (DTO) uchun umumiy interfeys yaratishingiz mumkin, bu esa ilovangiz qaysi mintaqada joylashtirilganidan qat'i nazar, ma'lumotlar tuzilmalarining izchilligini ta'minlaydi.

3. Generik sinflar

Sinflar ham generik bo'lishi mumkin:


class GenericNumber {
  zeroValue: T;
  add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

Bu GenericNumber sinfi T tipidagi qiymatni saqlashi va T tipida ishlaydigan add metodini aniqlashi mumkin. Siz sinfni kerakli tip bilan yaratasiz. Bu steklar yoki navbatlar kabi ma'lumotlar tuzilmalarini yaratish uchun juda foydali bo'lishi mumkin.

Global qo'llanilishi: Turli valyutalarni (masalan, USD, EUR, JPY) saqlashi va qayta ishlashi kerak bo'lgan moliyaviy dasturni tasavvur qiling. Siz CurrencyAmount sinfini yaratish uchun generik sinfdan foydalanishingiz mumkin, bu yerda T valyuta tipini ifodalaydi, bu esa har xil valyuta miqdorlarini tip xavfsizligi bilan hisoblash va saqlash imkonini beradi.

4. Bir nechta tip parametrlari

Generiklar bir nechta tip parametrlaridan foydalanishi mumkin:


function swap(a: T, b: U): [U, T] {
  return [b, a];
}

let result = swap("hello", 42);
// result[0] is number, result[1] is string

swap funksiyasi har xil tipdagi ikkita argumentni qabul qiladi va tiplari almashtirilgan kortejni qaytaradi.

Global ahamiyati: Xalqaro biznes ilovalarida sizda har xil turdagi ikkita bog'liq ma'lumotni, masalan, mijoz identifikatori (string) va buyurtma qiymati (number) kabi ma'lumotlarni qabul qiladigan va ularning kortejini qaytaradigan funksiya bo'lishi mumkin. Bu usul hech bir mamlakatga ustunlik bermaydi va global ehtiyojlarga mukammal moslashadi.

5. Generik cheklovlarda tip parametrlaridan foydalanish

Siz cheklov ichida tip parametrini ishlatishingiz mumkin.


function getProperty(obj: T, key: K) {
  return obj[key];
}

let obj = { a: 1, b: 2, c: 3 };

let value = getProperty(obj, "a"); // value is number

Bu misolda K extends keyof T K faqat T tipining kaliti bo'lishi mumkinligini anglatadi. Bu obyekt xususiyatlariga dinamik ravishda kirishda kuchli tip xavfsizligini ta'minlaydi.

Global qo'llanilishi: Bu, ayniqsa, ishlab chiqish jarayonida xususiyatlarga kirishni tekshirish kerak bo'lgan konfiguratsiya obyektlari yoki ma'lumotlar tuzilmalari bilan ishlashda foydalidir. Ushbu texnikani har qanday mamlakatdagi ilovalarda qo'llash mumkin.

6. Umumiy Yordamchi Tiplar

TypeScript keng tarqalgan tip o'zgartirishlarini amalga oshirish uchun generiklardan foydalanadigan bir nechta o'rnatilgan yordamchi tiplarni taqdim etadi. Bularga quyidagilar kiradi:

Masalan:


interface User {
  id: number;
  name: string;
  email: string;
}

// Partial - barcha xususiyatlar ixtiyoriy
let optionalUser: Partial = {};

// Pick - faqat id va name xususiyatlari
let userSummary: Pick = { id: 1, name: 'John' };

Global foydalanish holati: Ushbu yordamchi dasturlar API so'rovlari va javob modellarini yaratishda bebaho hisoblanadi. Masalan, global elektron tijorat ilovasida Partial yangilanish so'rovini (mahsulotning faqat ba'zi tafsilotlari yuborilganda) ifodalash uchun ishlatilishi mumkin, Readonly esa frontendda ko'rsatiladigan mahsulotni ifodalashi mumkin.

7. Generiklar bilan Tipni Avtomatik Aniqlash (Inference)

TypeScript ko'pincha siz generik funksiya yoki sinfga uzatgan argumentlarga asoslanib, tip parametrlarini avtomatik aniqlay oladi. Bu kodingizni toza va o'qish uchun osonroq qilishi mumkin.


function createPair(a: T, b: T): [T, T] {
  return [a, b];
}

let pair = createPair("hello", "world"); // TypeScript T ni string deb avtomatik aniqlaydi

Bu holda, TypeScript avtomatik ravishda T ning string ekanligini aniqlaydi, chunki ikkala argument ham satrlardir.

Global ta'siri: Tipni avtomatik aniqlash aniq tip izohlariga bo'lgan ehtiyojni kamaytiradi, bu esa kodingizni ixchamroq va o'qilishi osonroq qiladi. Bu turli xil tajriba darajalariga ega bo'lishi mumkin bo'lgan turli xil ishlab chiquvchilar jamoalari o'rtasidagi hamkorlikni yaxshilaydi.

8. Generiklar bilan Shartli Tiplar

Shartli tiplar generiklar bilan birgalikda boshqa tiplarning qiymatlariga bog'liq bo'lgan tiplarni yaratishning kuchli usulini taqdim etadi.


type Check = T extends string ? string : number;

let result1: Check = "hello"; // string
let result2: Check = 42; // number

Bu misolda, agar T string ni kengaytirsa, Check string ga, aks holda number ga baholanadi.

Global kontekst: Shartli tiplar ma'lum shartlarga asoslanib tiplarni dinamik ravishda shakllantirish uchun juda foydalidir. Mintaqaga qarab ma'lumotlarni qayta ishlaydigan tizimni tasavvur qiling. Shartli tiplar mintaqaga xos ma'lumotlar formatlari yoki tiplariga asoslanib ma'lumotlarni o'zgartirish uchun ishlatilishi mumkin. Bu global ma'lumotlarni boshqarish talablariga ega bo'lgan ilovalar uchun juda muhimdir.

9. Xaritalangan Tiplar bilan Generiklardan foydalanish

Xaritalangan tiplar boshqa tipga asoslanib, bir tipning xususiyatlarini o'zgartirish imkonini beradi. Moslashuvchanlik uchun ularni generiklar bilan birlashtiring:


type OptionsFlags = {
  [K in keyof T]: boolean;
};

interface FeatureFlags {
  darkMode: boolean;
  notifications: boolean;
}

// Har bir xususiyat bayrog'i yoqilgan (true) yoki o'chirilgan (false) bo'lgan tip yaratish
let featureFlags: OptionsFlags = {
  darkMode: true,
  notifications: false,
};

OptionsFlags tipi T umumiy tipini oladi va T ning xususiyatlari endi mantiqiy (boolean) qiymatlarga xaritalangan yangi tip yaratadi. Bu konfiguratsiyalar yoki xususiyat bayroqlari bilan ishlash uchun juda kuchli vositadir.

Global qo'llanilishi: Ushbu usul mintaqaga xos sozlamalarga asoslangan konfiguratsiya sxemalarini yaratishga imkon beradi. Ushbu yondashuv dasturchilarga mintaqaga xos konfiguratsiyalarni (masalan, mintaqada qo'llab-quvvatlanadigan tillar) aniqlash imkonini beradi. Bu global dastur konfiguratsiya sxemalarini osongina yaratish va saqlashga yordam beradi.

10. `infer` Kalit so'zi bilan Ilg'or Avtomatik Aniqlash

infer kalit so'zi shartli tiplar ichida boshqa tiplardan tiplarni ajratib olish imkonini beradi.


type ReturnType any> = T extends (...args: any) => infer R ? R : any;

function myFunction(): string {
  return "hello";
}

let result: ReturnType = "hello"; // natija string

Ushbu misol infer kalit so'zidan foydalanib funksiyaning qaytarish tipini aniqlaydi. Bu tipni yanada ilg'or manipulyatsiya qilish uchun murakkab usuldir.

Global ahamiyati: Ushbu texnika murakkab funksiya imzolari va murakkab ma'lumotlar tuzilmalari bilan ishlashda tip xavfsizligini ta'minlash uchun yirik, taqsimlangan global dasturiy loyihalarda hayotiy ahamiyatga ega bo'lishi mumkin. Bu boshqa tiplardan dinamik ravishda tiplarni yaratishga imkon beradi va kodning saqlanishini yaxshilaydi.

Eng yaxshi amaliyotlar va maslahatlar

Xulosa: Generiklar kuchini global miqyosda qabul qilish

TypeScript generiklari mustahkam va saqlanuvchan kod yozishning asosidir. Ushbu ilg'or usullarni o'zlashtirib, siz JavaScript ilovalaringizning tip xavfsizligini, qayta ishlatilishini va umumiy sifatini sezilarli darajada oshirishingiz mumkin. Oddiy tip cheklovlaridan tortib murakkab shartli tiplargacha, generiklar sizga global auditoriya uchun kengaytiriladigan va saqlanuvchan dasturiy ta'minot yaratish uchun kerakli vositalarni taqdim etadi. Unutmangki, generiklardan foydalanish tamoyillari geografik joylashuvingizdan qat'i nazar o'zgarmasdir.

Ushbu maqolada muhokama qilingan usullarni qo'llash orqali siz qaysi mamlakat, qit'a yoki biznes bilan shug'ullanishingizdan qat'i nazar, yaxshiroq tuzilgan, ishonchliroq va oson kengaytiriladigan kod yaratishingiz mumkin, bu esa oxir-oqibat muvaffaqiyatli dasturiy loyihalarga olib keladi. Generiklarni qabul qiling, va kodingiz sizga minnatdorchilik bildiradi!