IlmHamroh
JavaScript Full-stack/15-qism. TypeScript46/47-dars19 daqiqa
Mundarija (36)

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/undefined bo'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 more kabi tuzoqlarni taniysiz.
  • tsc chiqishidan 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:

text
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:

text
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:

text
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:7

Ikki 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 — Dish turidagi price: 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. tsc 7 union a'zolarini o'zining ichki tartibida chiqaradi: siz "taom" | "ichimlik" deb yozgan tur xabarda "ichimlik" | "taom" bo'lib ko'rinishi mumkin (Zod darsidagi TS2339 xabari kabi). TypeScript 5 boshqa tartibda yozishi mumkin edi. Ma'nosi bir xil — union'da tartib ahamiyatsiz.
  • Ba'zi kodlar almashgan. Masalan, satisfies da kalit yetishmasa TypeScript 7 TS2741 beradi (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:

ts
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:

text
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:

  1. Eng pastki qatordan boshlang: "string ni number ga berib bo'lmaydi". Bu — sabab.
  2. Bir qator yuqoriga: "dish.price turlari mos emas". Bu — sabab qayerda: dish ichidagi price.
  3. Eng yuqori qator — xato qayerda sezilgani: lines ni Order ga 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):

vazifalar ko'chishi: 383 xato kodlar bo'yicha
  • 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"

text
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.

ts
const prices = new Map<string, number>([["osh", 35000]]);
const osh: number = prices.get("osh");

Kompilyator:

text
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"

text
TS2345: Argument of type 'X' is not assignable to parameter of type 'Y'.

TS2322 ning funksiya chaqiruvidagi egizi. «Bahor» misoli — vazifalar dagi haqiqiy xato:

text
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"

ts
const guest = { name: "Dilshod aka", people: 4 };
console.log(guest.nmae);

Kompilyator:

text
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:

text
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"

text
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"

ts
const menu = new Map<string, number>([
  ["osh", 35000],
  ["manti", "30000"],
]);

Kompilyator:

text
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

ts
type Guest = { name: string; people: number; phone?: string };
const g: Guest = { name: "Malika", people: 2, phnoe: "+998" };
const h: Guest = { name: "Bobur" };

Kompilyator:

text
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 — phone ning imlo xatosi.

Tekshirib ko'ring: TS2345 va TS2322 — 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

text
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, await qo'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

text
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.

ts
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:

text
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
ts
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)); // false
  1. TS7006 — parametr turi: dish: Dish.
  2. TS2322 — find topmasligi mumkin: turni o'chirib, if (first !== undefined).
  3. TS2551 — bu safar taklif to'g'ri: prise → price. Tur to'g'ri, demak imlo.
  4. TS2322 — map massiv qaytaradi, yig'indi uchun reduce.
  5. TS2532 — spicy? ixtiyoriy: ?? false. Bu TS18048 ning eski, umumiyroq shakli: ifoda murakkab bo'lsa (menu[0].spicy), tsc nom o'rniga "Object" deydi. (menu[0]?. — noUncheckedIndexedAccess yoqilgan loyihada kerak, bizning kurs/mashqlar/15 da shunday. U yerda tsc 6 ta xato beradi: oxirgi qatorda TS2532 ikki marta, bir xil joyda ((10,13)) — menu[0] ning o'zi ham, uning spicy si ham undefined bo'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 oxirida jami. 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
ts
// 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'lmasa null, ?. uni undefined ga aylantiradi. [1] — birinchi guruh (TS\d+). noUncheckedIndexedAccess bilan uning turi string | 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.

ts
// 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:

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):

text
✔ 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.0762

Haqiqiy ma'lumotda. Vositani vazifalar ning DOM qadami oldidagi holatiga berdik (to'rt DOM moduli nomi .ts ga o'zgartirilgan, turlar yozilmagan):

bash
npx tsc --noEmit --pretty false \
  | node ../kurs/mashqlar/15/46-xato/cli.ts
text
TS18047  106
TS7006   50
TS2339   37
TS2551   6
TS18046  4
TS7005   4
TS2531   3
TS2345   3
TS7034   2
TS2532   2
TS7017   1
TS7053   1
jami     219

Xuddi 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).

bash
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 tsc xabari bo'ladi — ularni tez o'qish tezlikning katta qismi.
  • CI loglari — --pretty false shaklida, 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 Event haqida, chaqiruv mana bu".
  • Intervyu: "Uzun TypeScript xatosini qanday o'qiysiz?", "TS2322 va TS2345 farqi?", "No overload matches this call ni 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, TS7006 oilasi, 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
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
TypeScript xato xabarlarini o'qish: TS2322, TS2345, TS2339 va boshqalar — pastdan yuqoriga — IlmHamroh