Handbook davomida ko'rilgan eng keng tarqalgan 5 ta TypeScript xatosi (any, truthiness narrowing, union chalkashligi, generic constraint, exhaustiveness) — har biri diagnostika va test bilan.
Handbook davomida ko'rgan barcha muammolarni birlashtiruvchi maxsus debugging mashqlari to'plami.
index.tsTypeScriptfunction processResponse(response: any) {return response.data.items.map((item: any) => item.name);}
Your Task: Bu funksiya nega runtime'da xato berishi mumkin, garchi compile vaqtida hech qanday xato ko'rsatmasa ham?
<details> <summary>Diagnosis & Fix</summary> `any` — barcha tip tekshiruvini o'chiradi. Agar `response.data` yoki `response.data.items` mavjud bo'lmasa (masalan API xato qaytarsa), runtime'da `Cannot read property 'items' of undefined` xatosi yuz beradi, va TypeScript bu haqda hech qanday oldindan ogohlantirish bermaydi. Yechim — aniq interfeys yaratish: ```typescript interface ApiResponse { data: { items: { name: string }[] }; } function processResponse(response: ApiResponse) { return response.data.items.map((item) => item.name); } ``` </details>index.tsTypeScriptfunction getDiscount(user: { role: "admin" | "user"; discount?: number }) {if (user.discount) {return user.discount * 100;}return 0;}const result = getDiscount({ role: "user", discount: 0 });console.log(result); // Kutilgan: 0, lekin nima chiqadi?
Your Task: discount: 0 berilganda, funksiya qanday natija qaytaradi va bu kutilganmi?
index.tsTypeScripttype Status = "active" | "inactive";interface UserFilter {status: Status;}function filterUsers(filter: UserFilter | Status) {console.log(filter.status); // ?}
Your Task: Bu kod nega xato beradi?
<details> <summary>Diagnosis & Fix</summary> `filter` — `UserFilter | Status` union'ida, ya'ni yo `UserFilter` obyekti, yo `Status` (oddiy string) bo'lishi mumkin. Agar `filter` aslida `Status` (masalan `"active"`) bo'lsa, uning `.status` xususiyati yo'q — stringlarda `status` degan maydon mavjud emas. Yechim — narrowing: ```typescript function filterUsers(filter: UserFilter | Status) { if (typeof filter === "object") { console.log(filter.status); } else { console.log(filter); } } ``` </details>index.tsTypeScriptfunction getProperty<T>(obj: T, key: string) {return obj[key]; // ?}
Your Task: Bu funksiya nega xato beradi?
<details> <summary>Diagnosis & Fix</summary> `obj[key]` — `T` istalgan tur bo'lishi mumkin, va `key` istalgan `string` bo'lishi mumkin, shuning uchun TypeScript `key`ning `T`da haqiqatan mavjud ekanini "bilmaydi". Yechim — `keyof` bilan constraint: ```typescript function getProperty<T, K extends keyof T>(obj: T, key: K) { return obj[key]; // TO'G'RI — key endi T'ning haqiqiy kaliti bo'lishi kafolatlangan } ``` </details>index.tsTypeScripttype Action = { type: "add"; value: number } | { type: "remove"; value: number };function reducer(state: number, action: Action): number {if (action.type === "add") {return state + action.value;}if (action.type === "remove") {return state - action.value;}return state; // Kelajakda yangi 'type' qo'shilsa, bu unutilib qolishi mumkin}
Your Task: Bu kodning "yashirin" zaifligi nima?
<details> <summary>Diagnosis & Fix</summary> Agar kelajakda `Action`ga yangi variant (masalan `{ type: "reset" }`) qo'shilsa, bu funksiya uni "sezmasdan" oxirgi `return state;` orqali e'tiborsiz qoldiradi — hech qanday compile xatosi bo'lmaydi. Yechim — `switch` + exhaustiveness check (PART 14): ```typescript function reducer(state: number, action: Action): number { switch (action.type) { case "add": return state + action.value; case "remove": return state - action.value; default: const _exhaustive: never = action; return state; } } ``` </details>Task: Yuqoridagi 5 ta bugning barchasini o'z ichiga olgan (qasddan buzilgan) kichik TypeScript loyihasi yarating va ularni birma-bir tuzating.
Bu bob — handbook davomida ko'rilgan eng keng tarqalgan TypeScript xatolarini (any, truthiness narrowing, union type chalkashligi, generic constraint, exhaustiveness) amaliy tarzda mustahkamladi.
any — imkon qadar qochilishi kerak0, "" kabi "falsy" qiymatlarga ehtiyot bo'lingkeyof constraint ishlatingswitch ishlatganda, exhaustiveness check qo'shingcode.textTEXTany ishlatilganmi? → aniq interfeys/type bilan almashtiring0/"" bilan bog'liq xato? → !== undefined kabi aniq tekshiruv ishlatingUnion bilan xato? → typeof/in/instanceof orqali narrowing qilingobj[key] xato beryaptimi? → K extends keyof T constraint qo'shingYangi variant unutilib qoladimi? → switch + never orqali exhaustiveness check qo'shing
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 / 1 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: