TypeScript'ning avtomatik tip xulosasi (inference), qachon annotatsiya yozish kerakligi, return type annotatsiyasi va const bilan literal type xulosasi — chuqur test va debugging mashqlari bilan.
TypeScript har doim ham tip yozishni talab qilmaydi — u ko'p hollarda tipni o'zi "xulosa chiqaradi" (infer qiladi). Bu bob — qachon annotatsiya yozish, qachon xulosaga ishonish kerakligini chuqur yoritadi.
TypeScript compiler — o'zgaruvchiga berilgan boshlang'ich qiymatdan uning turini avtomatik aniqlaydi, bu "type inference" (tip xulosasi) deb ataladi.
index.tsTypeScriptlet name = "Abbosbek"; // TypeScript avtomatik: string deb "biladi"let age = 26; // numberlet isActive = true; // booleanname = 42; // XATO: TypeScript name'ni string deb "eslab qolgan"
Garchi : string yozilmagan bo'lsa ham, TypeScript namening turi haqida to'liq ma'lumotga ega — u faqat "ko'rinmas" annotatsiya, lekin baribir amal qiladi.
Annotatsiya (: Type) — TypeScript xulosa chiqara olmaydigan yoki xulosasi yetarli aniq bo'lmagan holatlarda zarur bo'ladi: funksiya parametrlari, bo'sh massiv/obyektlar, va kelajakda qiymat beriladigan o'zgaruvchilar.
index.tsTypeScript// Funksiya parametrlari — HAR DOIM annotatsiya kerak (TS ularni xulosa chiqara olmaydi)function greet(name: string) {return `Salom, ${name}`;}// Bo'sh massiv — annotatsiyasiz "any[]" bo'lib qoladilet items: string[] = [];// Kelajakda qiymat beriladigan o'zgaruvchilet result: number;result = calculateSomething();
⚠️ Common Mistake
Funksiya parametrlariga tip yozmaslik — ular avtomatik any bo'lib qoladi (agar noImplicitAny yoqilmagan bo'lsa), bu esa TypeScript'ning butun foydasini yo'qqa chiqaradi.
Funksiyaning qaytish turini (: ReturnType) yozish ixtiyoriy (TypeScript uni funksiya tanasidan xulosa chiqaradi), lekin bu murakkab funksiyalarda kod niyatini aniq qilish va xatolarni erta aniqlash uchun juda foydali.
index.tsTypeScript// Annotatsiyasiz — TypeScript xulosa chiqaradi: numberfunction add(a: number, b: number) {return a + b;}// Annotatsiya bilan — aniq, va agar tana noto'g'ri tur qaytarsa, XATO beradifunction multiply(a: number, b: number): number {return a * b;}function processUser(user: { name: string }): string {if (!user.name) {return; // XATO: bu funksiya 'string' qaytarishi kerak, lekin 'undefined' qaytarilmoqda}return user.name;}
💡 Key Idea
Return type annotation — funksiya "shartnomasi" (contract) sifatida ishlaydi. U funksiya ichida qanday xato qilinganini erta ushlab qolishga yordam beradi, ayniqsa uzun yoki murakkab funksiyalarda.
let bilan e'lon qilingan o'zgaruvchi uchun TypeScript kengroq tur (masalan string) xulosa chiqaradi, chunki qiymat keyinroq o'zgarishi mumkin. const bilan esa, qiymat o'zgarmasligi aniq bo'lgani uchun, TypeScript ko'pincha aniqroq "literal type" xulosa chiqaradi.
index.tsTypeScriptlet status1 = "active"; // tur: string (keng)const status2 = "active"; // tur: "active" (aniq literal type!)function setStatus(status: "active" | "inactive") {}setStatus(status1); // XATO: 'string' 'active' | 'inactive'ga mos kelmaydisetStatus(status2); // TO'G'RI: '"active"' — mos literal type
Task: Annotatsiyasiz uchta o'zgaruvchi (string, number, boolean turlarida) yarating va TypeScript ularning turini to'g'ri xulosa chiqarganini tekshiring (IDE orqali hover qiling).
Task: Ikkita sonni qo'shuvchi funksiya yozing, parametr va return type annotatsiyalarini aniq belgilang.
index.tsTypeScriptlet colors = ["red", "green", "blue"];colors.push(42);
🧠 Think first! Bu compile vaqtida xato beradimi?
<details> <summary>Answer</summary> Ha, xato beradi: `Argument of type 'number' is not assignable to parameter of type 'string'`.Why?
colors massivi ["red", "green", "blue"] boshlang'ich qiymatidan string[] deb xulosa chiqarilgan. 42 (number) qo'shishga urinish — bu xulosa chiqarilgan turga zid.
index.tsTypeScriptfunction getUserName(id: number) {if (id === 0) {return null;}return "Abbosbek";}const name = getUserName(1);console.log(name.toUpperCase());
Your Task: Bu kod compile vaqtida xato beradimi (strict rejimida)? Nega?
<details> <summary>Solution</summary> Ha. `getUserName` funksiyasining xulosa chiqarilgan qaytish turi — `string | null` (chunki u ham `null`, ham `string` qaytaradi). `name.toUpperCase()` chaqirilganda, TypeScript "agar `name` `null` bo'lsa, `toUpperCase` mavjud emas" deb xato beradi. Yechim — tekshiruv qo'shish: ```typescript if (name !== null) { console.log(name.toUpperCase()); } ``` </details>TypeScript — boshlang'ich qiymatdan tur xulosa chiqaradi (type inference), lekin funksiya parametrlari uchun annotatsiya har doim kerak. const — ko'pincha aniqroq literal type beradi. Return type annotatsiyasi — ixtiyoriy, lekin funksiya "kontraktini" aniq qiladi.
const — ko'pincha letga qaraganda aniqroq (literal) tur beradiindex.tsTypeScriptlet x = 5; // inferred: numberfunction f(a: number): number { return a; } // parametrlar — majburiy annotatsiyaconst y = "fixed"; // inferred: "fixed" (literal)let arr: string[] = []; // bo'sh massiv — annotatsiya kerak
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 / 2 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: