TypeScriptda umumlashmalarning cheklovlari
Oldingi darslarning birida biz o'ziga uzatilgan parametrning uzunligini chiqarishi kerak bo'lgan umumiy turdagi funktsiyani yaratgan edik. Biroq kompilyatsiya paytida bizga xatolik berildi, chunki barcha turlar uzunlikka ega bo'lmasligi mumkin:
function myFunc < T > (data: T): T {
console.log(data.length); // xatolik
return data;
}
O'sha paytda biz vaziyatni umumiy massiv
turiga o'zgartirish orqali tuzatdik.
Ammo TypeScriptda umumlashmalarning
cheklovlarini yaratish imkoniyati mavjud.
Buning uchun burchakli qavslar ichida,
T o'zgaruvchisidan keyin extends
kalit so'zini yozamiz. Undan keyin jingalak
qavslar ichida string turidagi yangi
str o'zgaruvchisini yozamiz.
Funktsiyaning qolgan kodi o'zgarishsiz
qoladi:
function myFunc <T extends {str: string}> (data: T): void {
console.log(data.str.length);
}
Ma'lum bo'lishicha, umumiy tur jingalak
qavslarda ko'rsatilgan str
o'zgaruvchisining turini meros qilib oladi.
Endi bizning funktsiyamizning ishlashini
tekshirib ko'ramiz va str turiga
ishlovchi myStr o'zgaruvchisini
yaratib, unga jingalak qavslar ichida
qiymat beramiz:
let myStr: {str: string} = {str: 'abcde'};
Keling, myFunc funktsiyasini chaqiramiz,
uning turini yana bir bor ko'rsatishni unutmaslik
kerak va myStr o'zgaruvchisini parametr
sifatida uzatamiz:
myFunc <{str: string}> (myStr);
Darsda ko'rib chiqilgan misol asosida, raqamli massivning uzunligini topish uchun funktsiyani tayinlang.