Mundarija (36)
- Bu darsda
- 1. Nega bu kerak?
- 2. Xabar anatomiyasi
- 2.1 Bir qatorlik shakl
- 2.2 Terminaldagi "chiroyli" shakl
- 2.3 Kodlar oilalari
- 2.4 Versiyalar orasidagi farq
- 3. Zanjirni pastdan yuqoriga o'qish
- 3.1 Ichma-ich turda xato
- 3.2 Nega literalda zanjir yo'q
- 4. Eng ko'p uchraydigan kodlar
- 4.1 Bizning statistika
- 4.2 TS2322 — "turni berib bo'lmaydi"
- 4.3 TS2345 — "argument mos emas"
- 4.4 TS2339 va TS2551 — "bunday xususiyat yo'q"
- 4.5 TS7006 va oilasi — "tur yozilmagan"
- 4.6 TS18047, TS18048, TS18046 — null, undefined, unknown
- 4.7 TS2769 — "birorta overload mos emas"
- 4.8 Obyekt xatolari: TS2741, TS2353, TS2561
- 5. Tuzoqlar va usullar
- 5.1 Kaskad: birinchi xatoni tuzating
- 5.2 … and 29 more — xabar qisqartirilgan
- 5.3 Turdagi ichki nomlar
- 5.4 Yordamchi vositalar
- 6. Ko'p uchraydigan xatolar (xatolar bilan ishlashda)
- 6.1 Xabarning faqat birinchi qatorini o'qish
- 6.2 "Did you mean"ga ko'r-ko'rona ishonish
- 6.3 Xatoni as, !, any, @ts-ignore bilan "yo'qotish"
- 6.4 TS5xxx ni kodda izlash
- 7. Mashqlar
- 1-mashq (oson): Zanjirni o'qing
- 2-mashq (o'rta): Beshta xato — beshta kod
- 3-mashq (qiyin): Amaliy tajriba — xato statistikasi vositasi
- 8. Real ishda
- Xulosa
- Manbalar
TypeScript xato xabarlarini o'qish: TS2322, TS2345, TS2339 va boshqalar — pastdan yuqoriga
Qisqacha: TypeScript xato xabari tuzilgan:
fayl(qator,ustun): error TS2322: <xabar>va ostida bo'sh joy bilan surilgan zanjir. Zanjirni pastdan yuqoriga o'qing: eng pastki qator — eng aniq sabab, eng yuqorisi — xato qayerda sezilgani. Amalda xatolarning katta qismi bir necha koddan iborat:TS2322(turni o'zgaruvchiga berib bo'lmaydi),TS2345(argument mos emas),TS2339(bunday xususiyat yo'q),TS7006(tur yozilmagan),TS18047/TS18048(null/undefinedbo'lishi mumkin),TS2769(birorta overload mos emas). Har birining tayyor tuzatish yo'li bor.
Bu darsda
- Xato xabarining qismlarini — joy, kod, matn, zanjir, "declared here" — o'qiysiz.
- Uzun zanjirni pastdan yuqoriga o'qib, sababni bir qarashda topasiz.
- Eng ko'p uchraydigan 10 ta kodni va har birining tuzatish yo'lini bilasiz.
- Kaskad xatolar, noto'g'ri "Did you mean" taklifi va
… and 29 morekabi tuzoqlarni taniysiz. tscchiqishidan xato statistikasini chiqaradigan kichik vosita yozasiz.
Oldin bilishingiz kerak: Nega TypeScript, JavaScript'dan TypeScript'ga ko'chish, TypeScript va DOM, Xato xabarini o'qish san'ati.
1. Nega bu kerak?
O'tgan darsda vazifalar ko'chishini yakunladik: 12 qadamda tsc 383 ta xato ko'rsatdi. 15-qism davomida siz ham kurs/mashqlar/15/XATOLAR.md daftarini to'ldirib keldingiz — har darsda yangi kodlar. Endi ularni jamlash vaqti.
Boshlovchi uchun TypeScript xabari qo'rqinchli ko'rinadi:
Type '{ dish: { name: string; price: string; }; count: number; }[]' is not assignable to type 'OrderLine[]'.Uzun, inglizcha, ichida jingalak qavslar. Lekin bu matn tasodifiy emas. Har xabar bir xil qolipda quriladi, kodlar esa takrorlanadi: vazifalar dagi 383 xatoning 165 tasi — bitta kod. Qolipni va o'nta kodni bilsangiz, xatolarning ko'pini o'qish bir necha soniyalik ishga aylanadi.
Xato xabarini o'qish san'ati darsida (3-qism) qoida bor edi: xabar — dushman emas, maslahatchi. TypeScript'da bu ayniqsa to'g'ri: u sizga ishga tushirishdan oldin gapiradi.
2. Xabar anatomiyasi
2.1 Bir qatorlik shakl
tsc --pretty false (yoki CI'da) xatoni shunday chiqaradi:
a.ts(7,34): error TS2322: Type 'string' is not assignable to type 'number'.| Qism | Ma'nosi |
|---|---|
a.ts(7,34) |
fayl, 7-qator, 34-ustun |
error |
jiddiylik (ogohlantirish yo'q — faqat xato) |
TS2322 |
xato kodi — qidirish uchun eng yaxshi kalit |
Type 'string' … |
xabar matni |
Kod — eng foydali qism. Matn TypeScript versiyalari orasida biroz o'zgarishi mumkin, kod esa o'zgarmaydi. Internetda "TS2322" deb qidirsangiz, minglab tushuntirish topasiz.
2.2 Terminaldagi "chiroyli" shakl
Oddiy npx tsc terminalda boshqacha ko'rsatadi:
a.ts:7:34 - error TS2322: Type 'string' is not assignable to type 'number'.
7 lines: [{ dish: { name: "Osh", price: "35000" }, count: 2 }],
~~~~~
a.ts:1:29 - The expected type comes from property 'price' which is declared here on type 'Dish'
1 type Dish = { name: string; price: number };
~~~~~
Found 1 error in a.ts:7Ikki yangi narsa:
- Qatorning o'zi va
~~~~~— aynan qaysi belgilar xato. - "declared here" bloki — bog'liq ma'lumot (related information): kutilgan tur qayerdan kelgani. Bu yerda —
Dishturidagiprice: number. Ko'pincha xatoning haqiqiy sababi shu ikkinchi joyda: ehtimol turning o'zi noto'g'ri yozilgan.
VS Code ham xuddi shu ma'lumotni ko'rsatadi: qizil chiziq ustida sichqonchani ushlab tursangiz — xabar, bog'liq joy esa bosiladigan havola.
2.3 Kodlar oilalari
Kod raqami tasodifiy emas — taxminan oila bo'yicha guruhlangan:
| Kodlar | Oila | Misol |
|---|---|---|
TS1xxx |
sintaksis va til qoidalari | TS1064, TS1206 |
TS2xxx |
turlar — eng katta oila | TS2322, TS2339 |
TS5xxx, TS6xxx |
sozlama va tsc buyrug'i |
TS5108, TS6306 |
TS7xxx |
yashirin any (noImplicitAny) |
TS7006, TS7053 |
TS18xxx |
yangi qo'shilganlar, ko'pi null |
TS18047, TS18048 |
TS5xxx ko'rsangiz — muammo kodda emas, tsconfig.json da. TS7xxx — "tur yozing". TS18xxx ning ko'pi — "null/undefined ni tekshiring".
2.4 Versiyalar orasidagi farq
Bu kursdagi har xabar tsc 7.0.2 dan aynan ko'chirilgan. Internetdagi maqolalar esa ko'pincha TypeScript 5 davrida yozilgan, va xabar matni biroz farq qilishi mumkin:
- Union tartibi.
tsc7 union a'zolarini o'zining ichki tartibida chiqaradi: siz"taom" | "ichimlik"deb yozgan tur xabarda"ichimlik" | "taom"bo'lib ko'rinishi mumkin (Zod darsidagiTS2339xabari kabi). TypeScript 5 boshqa tartibda yozishi mumkin edi. Ma'nosi bir xil — union'da tartib ahamiyatsiz. - Ba'zi kodlar almashgan. Masalan,
satisfiesda kalit yetishmasa TypeScript 7TS2741beradi (TypeScript 5.9 da esa —TS1360: Type … does not satisfy the expected type …, biz sinab ko'rdik; eski maqolalarda shu kod uchraydi).
Qoida o'sha: matnni so'zma-so'z solishtirmang — kodga va zanjirning pastki qatoriga qarang.
3. Zanjirni pastdan yuqoriga o'qish
3.1 Ichma-ich turda xato
«Bahor» buyurtmasi — ichma-ich tur. Taomlar ro'yxati alohida yig'ildi, keyin buyurtmaga berildi:
type Dish = { name: string; price: number };
type OrderLine = { dish: Dish; count: number };
type Order = { id: number; lines: OrderLine[] };
const lines = [{ dish: { name: "Osh", price: "35000" }, count: 2 }];
const order: Order = { id: 15, lines };Kompilyator:
TS2322: Type '{ dish: { name: string; price: string; }; count: number; }[]' is not assignable to type 'OrderLine[]'.
Type '{ dish: { name: string; price: string; }; count: number; }' is not assignable to type 'OrderLine'.
The types of 'dish.price' are incompatible between these types.
Type 'string' is not assignable to type 'number'.To'rt qator — to'rt qavat. Har pastki qator yuqoridagini aniqlashtiradi:
flowchart TB
A["1. massiv mos emas"] --> B["2. element mos emas"]
B --> C["3. dish.price turi mos emas"]
C --> D["4. string → number bo'lmaydi"]O'qish tartibi:
- Eng pastki qatordan boshlang: "
stringninumberga berib bo'lmaydi". Bu — sabab. - Bir qator yuqoriga: "
dish.priceturlari mos emas". Bu — sabab qayerda:dishichidagiprice. - Eng yuqori qator — xato qayerda sezilgani:
linesniOrderga berish paytida. Fayl va qator raqami shu joyni ko'rsatadi.
Tuzatish joyi — xabar ko'rsatgan qator emas, lines yaratilgan qator: price: 35000. Xato qayerda sezilgani va qayerda qilingani — har doim ham bir joy emas.
3.2 Nega literalda zanjir yo'q
Xuddi shu obyektni to'g'ridan-to'g'ri Order ga yozsak, xabar bir qatorli bo'ladi («Terminaldagi "chiroyli" shakl» bo'limidagi misol). Obyekt literali turiga yozilgan joyda tekshiriladi, va tsc aynan "35000" ni belgilaydi. Alohida o'zgaruvchidan kelganda esa u avval o'z turini oladi (price: string), keyin butun tur solishtiriladi — zanjir shu solishtirishning izi.
Amaliy maslahat: zanjir chalkash bo'lsa, ma'lumotga tur yaratilgan joyda yozing (const lines: OrderLine[] = …). Xato manbaga ko'chadi va qisqaradi.
Tekshirib ko'ring: Uch qatorli xabarning oxirgi qatori
Type 'undefined' is not assignable to type 'string'.. Sababni qayerdan izlaysiz?
Javob
Qayerdadir undefined bo'lishi mumkin bo'lgan qiymat (string | undefined) faqat string kutgan joyga berilgan. Odatda: ixtiyoriy xususiyat (note?: string), Map.get, arr[i] (noUncheckedIndexedAccess bilan) yoki find. O'rta qator qaysi xususiyat ekanini aytadi, birinchi qator — qaysi qatorda sezilganini.
4. Eng ko'p uchraydigan kodlar
4.1 Bizning statistika
Ikki manbadan sanadik. Birinchisi — vazifalar ko'chishidagi 383 ta haqiqiy xato (JavaScript'dan TypeScript'ga ko'chish qadamlari):
- TS7006165 xato
- TS18047106 xato
- TS233951 xato
- TS1804612 xato
- TS70059 xato
- TS70318 xato
- boshqa 13 kod32 xato
Manba: O'lchandi: tsc 7.0.2, vazifalar v4.1 → v5 ko'chishining 7 qadami (fayl nomi .ts bo'lganda), 2026-10-06
Ko'chishda deyarli hamma xato uch xil: tur yozilmagan (TS7006), null tekshirilmagan (TS18047), turda bunday xususiyat yo'q (TS2339).
Ikkinchi manba — 15-qismning 47 ta darsidagi kompilyator xabarlari: darslardagi har xato blokining tsc 7.0.2 tekshirgan xabarlari (sizning XATOLAR.md daftaringiz shulardan yig'ilgan). Jami 348 ta xabar, 92 xil kod. Eng ko'p uchraganlari:
| Kod | Nechta darsda | Necha marta |
|---|---|---|
TS2322 |
28 | 80 |
TS2339 |
20 | 34 |
TS2345 |
15 | 26 |
TS2741 |
11 | 19 |
TS7006 |
6 | 11 |
TS18046 / TS18048 |
8 / 7 | 10 / 10 |
Yangi kod yozishda boshqa uchlik oldinda: tayinlash (TS2322), xususiyat (TS2339), argument (TS2345). Ko'chishda esa — tur yozilmagan va null.
Ikkala ro'yxat birga — bugungi darsning "o'ntaligi".
4.2 TS2322 — "turni berib bo'lmaydi"
TS2322: Type 'X' is not assignable to type 'Y'.Ma'nosi: X turidagi qiymat Y turi kutilgan joyga (o'zgaruvchi, xususiyat, return) yozildi. Eng umumiy kod — hamma "mos emas" holatlarning onasi.
const prices = new Map<string, number>([["osh", 35000]]);
const osh: number = prices.get("osh");Kompilyator:
TS2322: Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.TypeScript aytyapti: "number | undefined ni number ga berib bo'lmaydi"; pastki qator — sabab: "undefined ni number ga berib bo'lmaydi" (Map.get kalitni topmasligi mumkin).
Tuzatish yo'llari: (1) qiymatni tuzating; (2) qiymat ba'zan boshqa turda bo'lishi tabiiy bo'lsa — uni tekshiring (?? 0, if); (3) kutilgan tur noto'g'ri bo'lsa — turni tuzating. as — yechim emas.
4.3 TS2345 — "argument mos emas"
TS2345: Argument of type 'X' is not assignable to parameter of type 'Y'.TS2322 ning funksiya chaqiruvidagi egizi. «Bahor» misoli — vazifalar dagi haqiqiy xato:
asosiy.ts(294,23): error TS2345: Argument of type 'number | null' is not assignable to parameter of type 'number'.
Type 'null' is not assignable to type 'number'.tahrirId — number | null (tahrir yo'q bo'lsa null), funksiya esa number kutadi. Tuzatish: chaqiruvdan oldin null ni tekshiring yoki parametrni number | null qiling — qaysi biri to'g'ri ekanini funksiyaning ma'nosi hal qiladi.
4.4 TS2339 va TS2551 — "bunday xususiyat yo'q"
const guest = { name: "Dilshod aka", people: 4 };
console.log(guest.nmae);Kompilyator:
TS2339: Property 'nmae' does not exist on type '{ name: string; people: number; }'.TypeScript aytyapti: "{ name: string; people: number; } turida nmae xususiyati yo'q".
Ikki xil sabab bor: imlo (nmae) yoki tur juda umumiy (Element da .value yo'q — DOM darsi). Xabardagi tur qaysi biri ekanini aytadi: tur to'g'ri bo'lsa — imlo; tur kutilganidan "kengroq" bo'lsa — toraytirish kerak.
TS2551 — xuddi shu xato, lekin "Did you mean …?" taklifi bilan. Taklifga ko'r-ko'rona ishonmang. vazifalar dan haqiqiy misol:
asosiy.ts(117,52): error TS2551: Property 'selectionStart' does not exist on type 'HTMLElement'. Did you mean 'onselectstart'?onselectstart — butunlay boshqa narsa (hodisa). selectionStart nomi to'g'ri, faqat u HTMLInputElement da, HTMLElement da emas. tsc mavjud turdagi o'xshash so'zni taklif qiladi — u sizning niyatingizni bilmaydi. Haqiqiy tuzatish — instanceof HTMLInputElement.
4.5 TS7006 va oilasi — "tur yozilmagan"
TS7006: Parameter 'name' implicitly has an 'any' type.Ma'nosi: "parametr turi yashirincha any bo'lib qoldi". strict (aniqrog'i noImplicitAny) bunga yo'l qo'ymaydi. Oilasi: TS7031 (destructuring parametr — { name }), TS7005/TS7034 (o'zgaruvchi), TS7053 (indeks bilan murojaat). Tuzatish: turni yozing. Bu xatolar ko'chishning eng oddiy qismi — ular "nima qilish kerak" ro'yxati.
4.6 TS18047, TS18048, TS18046 — null, undefined, unknown
| Kod | Xabar | Odatiy manba |
|---|---|---|
TS18047 |
'x' is possibly 'null'. |
querySelector, getElementById, match |
TS18048 |
'x' is possibly 'undefined'. |
?: xususiyat, find, arr[i], Map.get |
TS18046 |
'x' is of type 'unknown'. |
catch (e), JSON.parse ga yozilgan unknown |
Uchalasi ham bitta narsani so'raydi: avval tekshiring. TS18047/TS18048 uchun — if (x === null), ?., ??; TS18046 uchun — toraytirish (typeof, instanceof, tur predikati — Toraytirish). ! bilan "o'chirish" — xatoni yashirish, tuzatish emas.
4.7 TS2769 — "birorta overload mos emas"
const menu = new Map<string, number>([
["osh", 35000],
["manti", "30000"],
]);Kompilyator:
TS2769: No overload matches this call.
The last overload gave the following error.
Type 'string' is not assignable to type 'number'.TypeScript aytyapti: "chaqiruvga birorta ham overload mos kelmadi"; oxirgi overload'ning xatosi — "string ni number ga berib bo'lmaydi" ("30000" — satr).
Funksiyaning bir nechta imzosi (overload) bo'lsa, tsc hammasini sinab ko'radi va hech biri mos kelmasa — TS2769. Muhim tuzoq: xabar faqat oxirgi overload'ning xatosini ko'rsatadi ("The last overload gave the following error"). Bu har doim siz nazarda tutgan overload emas. DOM darsidagi addEventListener misolida oxirgi overload oddiy Event haqida gapirdi — sabab esa noto'g'ri hodisa nomi edi. Tuzatish: zanjirning pastini o'qing, keyin chaqiruvga qarang: argumentlar soni, tartibi, hodisa nomi. Ko'pincha muammo bitta argumentda.
4.8 Obyekt xatolari: TS2741, TS2353, TS2561
type Guest = { name: string; people: number; phone?: string };
const g: Guest = { name: "Malika", people: 2, phnoe: "+998" };
const h: Guest = { name: "Bobur" };Kompilyator:
TS2561: Object literal may only specify known properties, but 'phnoe' does not exist in type 'Guest'. Did you mean to write 'phone'?
TS2741: Property 'people' is missing in type '{ name: string; }' but required in type 'Guest'.- TS2741 — majburiy xususiyat yo'q. Tuzatish: qo'shing yoki turda ixtiyoriy qiling.
- TS2353 / TS2561 — ortiqcha xususiyat (Obyekt turlari);
TS2561— o'xshash nom topilganda. Bu yerda taklif to'g'ri:phnoe—phonening imlo xatosi.
Tekshirib ko'ring:
TS2345vaTS2322— ikkalasi ham "mos emas". Nega ikki xil kod?
Javob
Joy farq qiladi: TS2322 — tayinlashda (=, xususiyat, return), TS2345 — funksiya argumentida. Kod sizga qayerga qarashni aytadi: TS2345 bo'lsa — chaqiruv va funksiya imzosi, TS2322 bo'lsa — o'zgaruvchi yoki obyekt turi. Zanjirning pastki qatorlari esa ikkalasida bir xil o'qiladi.
5. Tuzoqlar va usullar
5.1 Kaskad: birinchi xatoni tuzating
Bitta xato ko'p xato tug'dirishi mumkin. const btn = document.querySelector("#pay") dan keyin btn ning 10 joyda ishlatilishi — 10 ta TS18047. Bitta instanceof tekshiruvi hammasini yo'qotadi. vazifalar da render.ts tiplangach, asosiy.ts dagi xatolar 219 dan 59 ga tushdi — tegilmagan faylda! Usul: xatolarni fayl va qator tartibida emas, sababi bo'yicha guruhlang. Eng ko'p takrorlangan xabar odatda bitta joydan kelgan.
5.2 … and 29 more — xabar qisqartirilgan
Type 'HTMLTextAreaElement' is missing the following properties from type 'HTMLInputElement': accept, align, alt, capture, and 29 more.tsc uzun ro'yxatlarni qisqartiradi. To'liq ko'rish kerak bo'lsa — npx tsc --noErrorTruncation. Lekin ko'pincha kerak emas: bu ro'yxat "turlar umuman boshqa" degani, sizga birinchi 4 tasi yetadi.
5.3 Turdagi ichki nomlar
Xabarda Promise<string[]> yoki { readonly ok: false; … } kabi uzun tur bo'lsa, unga nom bering (type Result<T, E> = …). Xabarlar qisqaradi: Result<number, string>. Discriminated union va Utility types darslaridagi turlarga nom berish odati xatolarni ham o'qiladigan qiladi.
5.4 Yordamchi vositalar
- VS Code — xatoni sichqoncha bilan ko'rsating, "Quick Fix" (Ctrl+.) ko'p xatoga tayyor tuzatish taklif qiladi: import qo'shish, nomni tuzatish,
awaitqo'shish. - TS Playground — xatoni kichik misolda ajratib olish: muammoli kodni 5–10 qatorga qisqartiring. Ko'pincha shu jarayonda sababni o'zingiz topasiz. Yordam so'raganda (forum, jamoa chati) — Playground havolasini yuboring.
- "Pretty TypeScript Errors" (VS Code kengaytmasi) — xabardagi turlarni formatlab, rang bilan ko'rsatadi. Foydali, lekin majburiy emas: bugungi o'qish usuli unsiz ham ishlaydi.
6. Ko'p uchraydigan xatolar (xatolar bilan ishlashda)
6.1 Xabarning faqat birinchi qatorini o'qish
Tuzatish: zanjirni oxirigacha, pastdan yuqoriga.
6.2 "Did you mean"ga ko'r-ko'rona ishonish
Tuzatish: taklif — mavjud turdagi o'xshash nom. Avval tur to'g'rimi — shuni tekshiring.
6.3 Xatoni as, !, any, @ts-ignore bilan "yo'qotish"
Tuzatish: sababini tuzating. Boshqa yo'l bo'lmasa — @ts-expect-error va izoh (Ko'chish darsi).
6.4 TS5xxx ni kodda izlash
Tuzatish: bu sozlama xatosi — tsconfig.json ni oching.
7. Mashqlar
1-mashq (oson): Zanjirni o'qing
TS2322: Type '{ guest: string; time: number; }[]' is not assignable to type 'Booking[]'.
Type '{ guest: string; time: number; }' is not assignable to type 'Booking'.
Types of property 'time' are incompatible.
Type 'number' is not assignable to type 'string'.Qaysi xususiyat xato: [:time]. U qanday turda bo'lishi kerak: [:string].
Yechim
Pastdan: "number ni string ga berib bo'lmaydi"; bir qator yuqorida — "time xususiyati turlari mos emas". Demak Booking da time: string (masalan "19:30"), ma'lumotda esa son (1930?). Tuzatish — ma'lumot yaratilgan joyda vaqtni satr qiling.
2-mashq (o'rta): Beshta xato — beshta kod
Quyidagi kod oddiy strict sozlamada (sayt va TS Playground shunday) 5 ta xato beradi. Har biri qaysi kod va qanday tuzatiladi? Avval o'zingiz ayting, keyin Playground'da tekshiring.
type Dish = { name: string; price: number; spicy?: boolean };
function priceText(dish) {
return `${dish.name}: ${dish.price} so'm`;
}
const menu: Dish[] = [{ name: "Osh", price: 35000 }];
const first: Dish = menu.find((d) => d.name === "Osh");
console.log(first.prise);
const total: number = menu.map((d) => d.price);
console.log(menu[0].spicy.toString());Kompilyator:
TS7006: Parameter 'dish' implicitly has an 'any' type.
TS2322: Type 'Dish | undefined' is not assignable to type 'Dish'.
Type 'undefined' is not assignable to type 'Dish'.
TS2551: Property 'prise' does not exist on type 'Dish'. Did you mean 'price'?
TS2322: Type 'number[]' is not assignable to type 'number'.
TS2532: Object is possibly 'undefined'.Yechim
type Dish = { name: string; price: number; spicy?: boolean };
function priceText(dish: Dish): string {
return `${dish.name}: ${dish.price} so'm`;
}
const menu: Dish[] = [{ name: "Osh", price: 35000 }];
const first = menu.find((d) => d.name === "Osh");
if (first !== undefined) {
console.log(priceText(first)); // Osh: 35000 so'm
}
const total = menu.reduce((sum, d) => sum + d.price, 0);
console.log(total); // 35000
console.log(String(menu[0]?.spicy ?? false)); // falseTS7006— parametr turi:dish: Dish.TS2322—findtopmasligi mumkin: turni o'chirib,if (first !== undefined).TS2551— bu safar taklif to'g'ri:prise→price. Tur to'g'ri, demak imlo.TS2322—mapmassiv qaytaradi, yig'indi uchunreduce.TS2532—spicy?ixtiyoriy:?? false. BuTS18048ning eski, umumiyroq shakli: ifoda murakkab bo'lsa (menu[0].spicy),tscnom o'rniga "Object" deydi. (menu[0]?.—noUncheckedIndexedAccessyoqilgan loyihada kerak, bizningkurs/mashqlar/15da shunday. U yerdatsc6 ta xato beradi: oxirgi qatordaTS2532ikki marta, bir xil joyda ((10,13)) —menu[0]ning o'zi ham, uningspicysi hamundefinedbo'lishi mumkin. Sozlama xatolar sonini o'zgartiradi — kodni emas.)
Beshta (yoki oltita) xato — besh xil sabab, lekin hammasi bugungi o'ntalikdan.
3-mashq (qiyin): Amaliy tajriba — xato statistikasi vositasi
kurs/mashqlar/15/46-xato/ da tsc --pretty false chiqishidan kodlar statistikasini chiqaradigan vosita yozing:
codes.ts:countCodes(output: string)—[kod, soni]juftliklari, ko'pidan kamiga;formatTable(rows)— matnli jadval va oxiridajami. Faqat asosiy qatorlar sanalsin — zanjir davomi (bo'sh joy bilan boshlanadigan) emas. Fayl nomisiz xatolar (error TS5108: …) ham sanalsin.cli.ts: standart kirishdan o'qib, jadvalni chiqarsin:npx tsc --pretty false | node 46-xato/cli.ts.codes.test.ts— uch test.
Ishora: qatordan kodni olish uchun RegExp va exec; sanash uchun Map; kirishni o'qish uchun node:stream/consumers dagi text(process.stdin).
Yechim
// 46-xato/codes.ts — tsc chiqishidan xato statistikasi
export type CodeCount = readonly [code: string, count: number];
// "fayl(12,5): error TS…" yoki "error TS5108: …" (fayl yo'q).
// Zanjir davomi (bo'sh joy bilan boshlanadi) sanalmaydi
const ERROR_LINE = /^(?:\S.*\): )?error (TS\d+): /;
export function countCodes(output: string): CodeCount[] {
const counts = new Map<string, number>();
for (const line of output.split(/\r?\n/)) {
const code = ERROR_LINE.exec(line)?.[1];
if (code !== undefined) {
counts.set(code, (counts.get(code) ?? 0) + 1);
}
}
return [...counts].toSorted((a, b) => b[1] - a[1]);
}
export function formatTable(rows: readonly CodeCount[]): string {
const total = rows.reduce((sum, [, count]) => sum + count, 0);
const lines = rows.map(([code, n]) => `${code.padEnd(8)} ${n}`);
return [...lines, `${"jami".padEnd(8)} ${total}`].join("\n");
}CodeCount— nomlangan tuple (Massiv va tuple).exec(line)?.[1]— moslik bo'lmasanull,?.uniundefinedga aylantiradi.[1]— birinchi guruh (TS\d+).noUncheckedIndexedAccessbilan uning turistring | undefined— tekshiruv shart.toSorted— asl massivni o'zgartirmaydi (nusxa bilan ishlaydigan metodlar).
Bizdagi birinchi variant yiqildi. Regex /^\S.*error (TS\d+): / edi — "qator bo'sh joysiz belgi bilan boshlanadi va keyin error". Fayl nomisiz error TS5108: … qatorida error dan oldin hech narsa yo'q: test TS5108 ni topmadi (AssertionError … TS5108). Tuzatilgan regex fayl qismini ixtiyoriy qiladi: (?:\S.*\): )?. Testlar aynan shunday chegaraviy holatlarni ushlaydi.
// 46-xato/cli.ts — npx tsc --pretty false | node 46-xato/cli.ts
import { text } from "node:stream/consumers";
import { countCodes, formatTable } from "./codes.ts";
const output = await text(process.stdin);
console.log(formatTable(countCodes(output)));46-xato/codes.test.ts:
import { test } from "node:test";
import assert from "node:assert/strict";
import { countCodes, formatTable } from "./codes.ts";
const SAMPLE = [
"a.ts(1,7): error TS2322: Type 'string' is not assignable to …",
" Type 'string' is not assignable to type 'number'.",
"b.ts(3,1): error TS18047: 'btn' is possibly 'null'.",
"b.ts(9,1): error TS18047: 'form' is possibly 'null'.",
"error TS5108: Option 'target=ES5' has been removed.",
].join("\n");
test("kodlar sanaladi, zanjir davomi hisobga olinmaydi", () => {
assert.deepEqual(countCodes(SAMPLE), [
["TS18047", 2],
["TS2322", 1],
["TS5108", 1],
]);
});
test("bo'sh chiqish — bo'sh ro'yxat", () => {
assert.deepEqual(countCodes(""), []);
});
test("jadval jami bilan", () => {
const table = formatTable([["TS7006", 3], ["TS2339", 1]]);
assert.equal(table, "TS7006 3\nTS2339 1\njami 4");
});node --test 46-xato/codes.test.ts — bizda (Node 24.21.0):
✔ kodlar sanaladi, zanjir davomi hisobga olinmaydi (3.2861ms)
✔ bo'sh chiqish — bo'sh ro'yxat (0.3874ms)
✔ jadval jami bilan (0.7248ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 319.0762Haqiqiy ma'lumotda. Vositani vazifalar ning DOM qadami oldidagi holatiga berdik (to'rt DOM moduli nomi .ts ga o'zgartirilgan, turlar yozilmagan):
npx tsc --noEmit --pretty false \
| node ../kurs/mashqlar/15/46-xato/cli.tsTS18047 106
TS7006 50
TS2339 37
TS2551 6
TS18046 4
TS7005 4
TS2531 3
TS2345 3
TS7034 2
TS2532 2
TS7017 1
TS7053 1
jami 219Xuddi o'sha 219 ta. Bir qarashda ko'rinadi: ishning yarmi — null tekshiruvlari, chorak qismi — parametr turlari. Katta ko'chishni rejalashtirishda aynan shu jadval kerak.
Oxirida XATOLAR.md ni oching va bu darsdagi o'ntalik bilan solishtiring: qaysi kodlar sizda ko'p uchradi? TS2551 va TS2769 ni qo'shing (agar hali yo'q bo'lsa).
git add 15/46-xato 15/XATOLAR.md
git commit -m "15/46: tsc xato statistikasi vositasi va testlar"8. Real ishda
- Har kuni. Professional TypeScript dasturchining kunida o'nlab
tscxabari bo'ladi — ularni tez o'qish tezlikning katta qismi. - CI loglari —
--pretty falseshaklida, rangsiz: fayl(qator,ustun) dan kerakli joyga o'tish, kodni qidirish. - Yordam so'rash — xabarni to'liq (zanjiri bilan) va Playground havolasi bilan yuboring. "TS ishlamayapti" emas, "TS2769, oxirgi overload
Eventhaqida, chaqiruv mana bu". - Intervyu: "Uzun TypeScript xatosini qanday o'qiysiz?", "
TS2322vaTS2345farqi?", "No overload matches this callni qanday tuzatasiz?".
Xulosa
- Xabar:
fayl(qator,ustun): error TSkod: matn+ zanjir + "declared here". Kod — eng barqaror qidiruv kaliti. - Zanjirni pastdan yuqoriga o'qing: pastda — sabab, yuqorida — qayerda sezilgani. Tuzatish joyi ko'pincha ma'lumot yaratilgan qator.
- O'ntalik:
TS2322,TS2345,TS2339/TS2551,TS7006oilasi,TS18047/TS18048/TS18046,TS2769,TS2741/TS2353. - "Did you mean" — o'xshash nom taklifi, niyat emas.
TS2769— faqat oxirgi overload'ning xatosi. - Kaskad: bitta sabab — o'nlab xato. Sababi bo'yicha guruhlang; statistika vositasi yordam beradi.
Keyingi dars: TypeScript best practices va anti-patternlar — 15-qism yakuni: yaxshi TypeScript kodi qanday ko'rinadi, any, as va murakkab turlarning qachon zarar keltirishi.
Manbalar
- TypeScript hujjatlari: "Understanding Errors" — typescriptlang.org/docs/handbook/2/understanding-errors.html
- TSConfig:
noErrorTruncation,pretty— typescriptlang.org/tsconfig - TypeScript manba kodi:
diagnosticMessages.json— github.com/microsoft/TypeScript (hamma xabarlar va kodlar) - Pretty TypeScript Errors (VS Code kengaytmasi) — marketplace.visualstudio.com
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!