Generiklarning muammoni yechish mantig'i, generic interfeys/type alias, generic constraints (extends), bir nechta type parameter va default turlar — chuqur, bosqichma-bosqich test va debugging mashqlari bilan.
Generiklar — TypeScript'ning eng kuchli va, ayni paytda, yangi boshlovchilar uchun eng qiyin tushunchalaridan biri. Bu bob generiklarni noldan, ko'plab bosqichma-bosqich misollar bilan chuqur tushuntiradi.
index.tsTypeScriptfunction getFirstElement(arr: any[]): any {return arr[0];}const first = getFirstElement([1, 2, 3]);first.toUpperCase(); // XATO BERMAYDI (compile vaqtida), lekin runtime'da XATO!
any bilan — TypeScript firstning haqiqiy turini "unutadi", bu esa xato imkoniyatini oldini olmaydi.
index.tsTypeScriptfunction getFirstElement<T>(arr: T[]): T {return arr[0];}const first = getFirstElement([1, 2, 3]); // T = number deb xulosa chiqariladifirst.toUpperCase(); // XATO: Property 'toUpperCase' does not exist on type 'number'const firstName = getFirstElement(["Ali", "Vali"]); // T = stringfirstName.toUpperCase(); // TO'G'RI ISHLAYDI
<T> — "type parameter" (tip parametri). U funksiya chaqirilganda, berilgan argumentga qarab avtomatik "to'ldiriladi" (masalan T = number yoki T = string), va funksiya butun davomida O'SHA aniq turni "eslab qoladi".
index.tsTypeScriptinterface Box<T> {value: T;}const numberBox: Box<number> = { value: 42 };const stringBox: Box<string> = { value: "salom" };type Pair<A, B> = {first: A;second: B;};const coordinate: Pair<number, number> = { first: 10, second: 20 };const entry: Pair<string, number> = { first: "yosh", second: 26 };
index.tsTypeScriptinterface ApiResponse<T> {data: T;status: number;message: string;}interface User {id: number;name: string;}const userResponse: ApiResponse<User> = {data: { id: 1, name: "Abbosbek" },status: 200,message: "OK",};
Ba'zan generic tip parametri "istalgan tur" emas, balki MA'LUM shartga javob beruvchi tur bo'lishi kerak. Bu — extends kalit so'zi orqali "cheklov" (constraint) qo'yish orqali amalga oshiriladi.
index.tsTypeScript// Muammo: T ustida .length ishlatib bo'lmaydi, chunki T istalgan tur bo'lishi mumkinfunction getLength<T>(item: T): number {return item.length; // XATO: Property 'length' does not exist on type 'T'}// Yechim: constraint qo'shishinterface HasLength {length: number;}function getLength<T extends HasLength>(item: T): number {return item.length; // TO'G'RI — T endi "length"ga ega bo'lishi KAFOLATLANGAN}getLength("salom"); // TO'G'RI — string'da length borgetLength([1, 2, 3]); // TO'G'RI — array'da length borgetLength(42); // XATO: number'da length yo'q
index.tsTypeScriptfunction merge<T, U>(obj1: T, obj2: U): T & U {return { ...obj1, ...obj2 };}const merged = merge({ name: "Abbosbek" }, { age: 26 });// merged turi: { name: string } & { age: number }console.log(merged.name, merged.age);// Default generic turinterface Container<T = string> {value: T;}const defaultContainer: Container = { value: "salom" }; // T avtomatik 'string'const numberContainer: Container<number> = { value: 42 };
💡 Key Idea
merge funksiyasi — PART 4'da ko'rgan intersection type (&) bilan generiklarni birlashtirib, ikkita har xil turdagi obyektni xavfsiz tarzda birlashtiradigan, to'liq qayta ishlatiluvchi funksiya yaratadi.
Task: Istalgan turdagi massivni qabul qilib, uni teskari tartibda qaytaruvchi generic reverseArray<T> funksiyasini yozing.
Task: id: number maydoniga EGA bo'lishi kerak bo'lgan generic constraint bilan, ID bo'yicha massivdan element topuvchi findById<T extends { id: number }> funksiyasini yozing.
Task: ApiResponse<T> generic interfeysini yaratib, uni User, Product kabi turli ma'lumot turlari bilan qayta ishlating, va bitta fetchData<T>(url: string): Promise<ApiResponse<T>> funksiyasi yozing (implementatsiyasiz, faqat tur imzosi).
index.tsTypeScriptfunction firstOrDefault<T>(arr: T[], defaultValue: T): T {return arr.length > 0 ? arr[0] : defaultValue;}const result = firstOrDefault([1, 2, 3], "yo'q");
🧠 Think first! Bu compile vaqtida xato beradimi?
<details> <summary>Answer</summary> Ha, xato beradi: `Argument of type 'string' is not assignable to parameter of type 'number'`.Why?
Birinchi argument ([1, 2, 3])dan TypeScript T = number deb xulosa chiqaradi. Shundan keyin, ikkinchi argument (defaultValue) ham AYNAN shu T (ya'ni number) turida bo'lishi kutiladi — lekin "yo'q" — string.
index.tsTypeScriptfunction wrapInArray<T>(value: T) {return [value];}const numbers = wrapInArray(5);const numbers2: string[] = wrapInArray(5); // ?
Your Task: Ikkinchi qator nega xato beradi?
<details> <summary>Solution</summary> `wrapInArray(5)` — `T = number` deb xulosa chiqarib, `number[]` qaytaradi. Ikkinchi qatorda esa uni `string[]` turiga majburlab tayinlashga urinilmoqda, bu turlar mos kelmagani uchun xato beradi: `Type 'number[]' is not assignable to type 'string[]'`. Bu — generiklarning to'g'ri ishlashini ko'rsatuvchi "kutilgan xato" — agar bu xato berilmaganida, generic tizimning o'zi buzilgan bo'lardi. </details>Generiklar — anyning moslashuvchanligini, tip xavfsizligini yo'qotmasdan beradi. <T> — type parameter, u chaqiruv vaqtida aniq turga "to'ldiriladi". Generic constraint (extends) — Tni ma'lum shartga cheklaydi. Bir nechta type parameter va default turlar — generiklarni yanada moslashuvchan qiladi.
anydan farqli, tip xavfsizligini saqlab qoladiTni argumentlardan avtomatik xulosa chiqaradi<T extends X> — Tni X "shakli"ga ega turlar bilan cheklaydiT — barcha parametr/qaytish turlarida izchil bo'lishi kerakindex.tsTypeScriptfunction identity<T>(value: T): T { return value; }interface Box<T> { value: T; }function getLen<T extends { length: number }>(x: T): number { return x.length; }function merge<T, U>(a: T, b: U): T & U { return { ...a, ...b }; }
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: