Literal types, typeof/instanceof/in orqali type narrowing, truthiness va equality narrowing — union type'lar bilan xavfsiz ishlashning asosiy texnikasi, chuqur test va debugging bilan.
Bu — TypeScript'dagi eng kuchli va amaliy jihatdan eng ko'p ishlatiladigan tushunchalardan biri: union type'lar bilan xavfsiz ishlashning kaliti.
Literal type — faqat BITTA aniq qiymatni qabul qiladigan tur (masalan faqat "active" so'zi, boshqa hech qanday string emas).
index.tsTypeScriptlet direction: "left" = "left";direction = "right"; // XATO: Type '"right"' is not assignable to type '"left"'// Odatda union bilan birga ishlatiladitype Direction = "left" | "right" | "up" | "down";
index.tsTypeScriptfunction formatValue(value: string | number) {if (typeof value === "string") {return value.toUpperCase(); // Bu yerda TypeScript value'ni 'string' deb "biladi"}return value.toFixed(2); // Bu yerda 'number' deb "biladi"}
typeof tekshiruvi — TypeScript'ga "shu shart ichida, value aniq shu turda" deb signal beradi. Bu jarayon "type narrowing" (tur toraytirish) deb ataladi — keng union type, shart ichida torroq, aniqroq turga "toraytiriladi".
index.tsTypeScriptclass Dog { bark() { console.log("Vov!"); } }class Cat { meow() { console.log("Miyov!"); } }function makeSound(animal: Dog | Cat) {if (animal instanceof Dog) {animal.bark();} else {animal.meow();}}interface Fish { swim(): void; }interface Bird { fly(): void; }function move(animal: Fish | Bird) {if ("swim" in animal) {animal.swim();} else {animal.fly();}}
index.tsTypeScriptfunction printLength(value: string | null | undefined) {if (value) { // truthiness narrowing — bo'sh string, null, undefined hammasi "falsy"console.log(value.length);}}function compare(a: string | number, b: string | number) {if (typeof a === typeof b && typeof a === "string") {// a va b — ikkalasi ham stringconsole.log(a.concat(b as string));}}
⚠️ Common Mistake
Truthiness narrowing — null/undefinedni "falsy" deb to'g'ri tekshiradi, lekin bo'sh string ("") yoki 0 kabi boshqa "falsy" qiymatlarni ham tasodifan chetlab qo'yishi mumkin, agar bu hisobga olinmasa.
Task: string | number union qabul qiluvchi funksiya yozing, typeof orqali narrowing qilib, har biri uchun mos amal bajaring.
Task: Circle va Square interfeyslarini yaratib, "radius" in shape orqali ularni farqlovchi getArea funksiyasini yozing.
Task: Bo'sh string va nullni farqlaydigan, faqat null/undefined uchun if (value) o'rniga aniqroq tekshiruv ishlatuvchi funksiya yozing.
index.tsTypeScriptfunction processValue(value: string | number) {if (typeof value === "string" || typeof value === "number") {return value.toString();}return value; // ?}
🧠 Think first! Oxirgi return value; qatorida TypeScript qanday xato (yoki xato bermaslik) haqida signal beradi?
index.tsTypeScriptfunction getFirstChar(value: string | string[]) {return value[0].toUpperCase();}
Your Task: Bu kod compile vaqtida xato bermaydi, lekin nima uchun bu "tasodifiy ishlash" hisoblanadi, narrowing qilinmagan holda?
<details> <summary>Solution</summary> Bu kod texnik jihatdan ishlaydi, chunki `string[0]` — bitta belgi (string), `string[][0]` — massivning birinchi elementi (string), va ikkalasida ham `.toUpperCase()` mavjud. Lekin bu — "tasodifiy mos kelish", umumiy holatda ishonchli emas. Agar `value` aslida `number[]` bo'lganda (garchi bu funksiya turi bunga ruxsat bermasa ham, kelajakda kod o'zgarishi mumkin), bu yondashuv ishlamay qolardi. Yaxshiroq amaliyot — har doim aniq narrowing qilish: ```typescript function getFirstChar(value: string | string[]) { if (Array.isArray(value)) { return value[0].toUpperCase(); } return value[0].toUpperCase(); } ``` </details>Literal type — aniq bitta qiymatga cheklangan tur. Type narrowing — typeof, instanceof, in, truthiness va boshqa tekshiruvlar orqali, union type'ni shart ichida torroq, aniqroq turga "toraytirish" jarayoni. Bu — union type bilan xavfsiz ishlashning asosiy mexanizmi.
typeof — primitivlar orasida narrowing uchuninstanceof — class instansiyalari orasida narrowing uchunin — interfeyslar orasida narrowing uchunindex.tsTypeScriptif (typeof x === "string") { }if (x instanceof Dog) { }if ("swim" in animal) { }if (Array.isArray(x)) { }if (x != null) { } // null va undefined ikkalasini ham tekshiradi
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: