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:
Partial
:T
ning barcha xususiyatlarini ixtiyoriy qiladi.Required
:T
ning barcha xususiyatlarini majburiy qiladi.Readonly
:T
ning barcha xususiyatlarini faqat o'qish uchun qiladi.Pick
:T
dan xususiyatlar to'plamini tanlaydi.Omit
:T
dan xususiyatlar to'plamini o'chiradi.
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
- Mazmunli nomlardan foydalaning: O'qishni osonlashtirish uchun umumiy tip parametrlaringiz uchun tavsiflovchi nomlarni tanlang (masalan,
TValue
,TKey
). - Generiklaringizni hujjatlashtiring: Umumiy tiplaringiz va cheklovlaringizning maqsadini tushuntirish uchun JSDoc izohlaridan foydalaning. Bu jamoaviy hamkorlik uchun, ayniqsa dunyoning turli burchaklarida joylashgan jamoalar bilan ishlashda juda muhim.
- Oddiy saqlang: Generiklaringizni haddan tashqari murakkablashtirishdan saqlaning. Oddiy yechimlardan boshlang va ehtiyojlaringiz o'zgarganda refaktoring qiling. Ortiqcha murakkablik ba'zi jamoa a'zolari uchun tushunishni qiyinlashtirishi mumkin.
- Qamrov doirasini hisobga oling: Umumiy tip parametrlaringizning qamrov doirasini diqqat bilan ko'rib chiqing. Kutilmagan tip nomuvofiqliklarini oldini olish uchun ular imkon qadar tor bo'lishi kerak.
- Mavjud yordamchi tiplardan foydalaning: Iloji boricha TypeScript-ning o'rnatilgan yordamchi tiplaridan foydalaning. Ular sizga vaqt va kuchni tejashga yordam beradi.
- Puxta sinovdan o'tkazing: Generik kodingiz turli tiplar bilan kutilganidek ishlashini ta'minlash uchun keng qamrovli birlik testlarini yozing.
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!