IlmHamroh
JavaScript Full-stack/15-qism. TypeScript1/47-dars18 daqiqa
Mundarija (35)

TypeScript nima va nega kerak: xatoni kod ishga tushmasdan topish

Qisqacha: TypeScript — JavaScript'ning ustiga turlar qo'shilgan til. Siz price: number deb yozasiz, TypeScript kompilyatori esa kodni ishga tushirmasdan tekshiradi: satr kelsa, maydon nomi xato yozilsa — darhol aytadi. Keyin turlar o'chiriladi va oddiy JavaScript qoladi. Shuning uchun TypeScript faqat sizning kodingizni tekshiradi: serverdan yoki formadan ishlash paytida kelgan noto'g'ri qiymatni u ko'rmaydi.

Bu darsda

  • Dinamik va statik tiplash farqini «Bahor» misolida tushuntira olasiz.
  • TypeScript kompilyatori xabarini o'qiy olasiz: TS2339, TS2345 kabi kodlar nimani aytadi.
  • "Superset" va "turlar o'chadi" (type erasure) nimani anglatishini ayta olasiz.
  • TypeScript nimani ushlamasligini bilasiz va undan nimani kutmaslik kerakligini tushunasiz.
  • TypeScript'ning foydasi va narxini solishtira olasiz.

Oldin bilishingiz kerak: JSDoc va // @ts-check, typeof va turni to'g'ri aniqlash, Algoritmlar real frontend va backend ishida.

1. Nega bu kerak?

15-qism boshlandi. Bu qismda TypeScript tilini o'rganamiz va vazifalar ilovasini bosqichma-bosqich unga ko'chiramiz. Lekin avval savol: allaqachon ishlaydigan JavaScript bor ekan, yana bitta til nimaga kerak?

Javobni «Bahor» oshxonasidan boshlaymiz. Juma kuni kechqurun Jasur aka kassadagi chekka qaradi va hayron bo'ldi. Ikki porsiya osh va ikki choynak ko'k choy uchun chekda "Jami: NaN so'm" turibdi. Sardor kodni tuzatdi, endi summa chiqdi. Lekin choy puli qo'shilgach, chekda "800008000 so'm" paydo bo'ldi — sakkiz yuz million!

Ikkala xato ham kichik edi. Lekin ikkalasi ham faqat mijoz oldida, kod ishlab turganda chiqdi. Bugun shu ikki xatoni ko'ramiz va TypeScript ularni kod ishga tushmasdan qanday topishini kuzatamiz.

1.1 Birinchi xato: maydon nomi

Sardorning kodi:

js
const order = [
  { dish: "Osh", price: 35000, quantity: 2 },
  { dish: "Ko'k choy", price: 5000, quantity: 2 },
];

function orderTotal(items) {
  let total = 0;
  for (const item of items) {
    total += item.price * item.qty;
  }
  return total;
}

console.log(orderTotal(order)); // NaN

Ko'rdingizmi? Obyektda maydon nomi quantity, Sardor esa item.qty deb yozgan. JavaScript yo'q maydon uchun xato bermaydi — undefined qaytaradi. 35000 * undefined esa NaN. Dastur jim davom etadi, chekda "NaN so'm" chiqadi.

1.2 Ikkinchi xato: satr va son

Sardor qty ni quantity ga tuzatdi. Keyin choy puli (tip) qo'shiladigan bo'ldi. Ofitsiant uni formadagi maydonga yozadi:

js
function addTip(total, tip) {
  return total + tip;
}

const tip = "8000"; // formadagi maydon qiymati — doim satr
console.log(addTip(80000, tip)); // 800008000

Formadagi <input> qiymati har doim satr bo'ladi — buni forma darslaridan bilasiz. 80000 + "8000" esa qo'shish emas, satrlarni ulash: "800008000".

Ikkala holatda ham JavaScript "to'g'ri" ishladi: u o'z qoidalarini bajardi. Muammo boshqa joyda — kodda yozilmagan shartnoma bor edi: "price va quantity — son, tip — son". Bu shartnomani faqat Sardorning boshi bilardi.

Tekshirib ko'ring: Nega birinchi xato NaN, ikkinchisi esa uzun son ko'rinishidagi satr berdi?

Javob

Birinchisida item.qty — undefined, son bilan ko'paytirilsa NaN chiqadi. Ikkinchisida + belgisining bir tomonida satr bor: JavaScript bunda qo'shmaydi, ikkala qiymatni satr qilib ulaydi. Ikkala holatda ham xato xabari yo'q — shuning uchun ular xavfli.

2. TypeScript bu xatolarni qanday ushlaydi

2.1 Shartnomani kodga yozamiz

JSDoc va // @ts-check darsida shartnomani izohga yozgan edingiz: @param {number} price. TypeScript'da xuddi shu narsa kodning o'zida yoziladi: price: number.

TypeScript — JavaScript'ga turlar qo'shilgan til. Uni Microsoft yaratgan, birinchi ommaviy versiyasi 2012-yil oktyabrda chiqqan. Fayl kengaytmasi — .ts.

Sardorning kodini TypeScript'da yozamiz:

ts
type OrderItem = { dish: string; price: number; quantity: number };

function orderTotal(items: OrderItem[]): number {
  let total = 0;
  for (const item of items) {
    total += item.price * item.qty;
  }
  return total;
}

function addTip(total: number, tip: number): number {
  return total + tip;
}

const tip = "8000"; // formadagi maydon qiymati — satr
console.log(addTip(orderTotal([]), tip));

Kompilyator:

text
TS2339: Property 'qty' does not exist on type 'OrderItem'.
TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

Qatorma-qator:

  • type OrderItem = { … } — buyurtmadagi bitta qator turi: unda dish (satr), price va quantity (son) bor. Bu 12/39 dagi @typedef ning TypeScript shakli. type ni type va interface darsida batafsil o'rganamiz.
  • items: OrderItem[] — "items — OrderItem lar massivi".
  • ): number — funksiya son qaytaradi.
  • tip: number — choy puli son bo'lishi shart.

Ikkala xato ham topildi. Kod hali bir marta ham ishga tushmadi.

2.2 Xabarlarni o'qiymiz

Birinchi xabar: Property 'qty' does not exist on type 'OrderItem'. Tarjimasi: "OrderItem turida qty xususiyati yo'q". Kompilyator OrderItem ning shaklini biladi. qty u yerda yo'q — demak, yozuvda xato bor.

Ikkinchi xabar: Argument of type 'string' is not assignable to parameter of type 'number'. Tarjimasi: "string turidagi argumentni number turidagi parametrga berib bo'lmaydi". Bu xabarni 12/39 dan taniysiz — o'sha TS2345.

Har xabar boshida xato kodi turadi: TS2339, TS2345. Kod — xabarning raqamli nomi. Uni Google'ga yozsangiz, o'sha xato haqida minglab tushuntirish topasiz. Ko'p uchraydigan kodlarni TS xato xabarlarini o'qish va tuzatish darsida jamlaymiz.

Maslahat: Saytda har ```ts kod ostida «TS Playground'da ochish» havolasi bor. U kodni TypeScript'ning rasmiy onlayn muharririda ochadi va xatolarni qizil chiziq bilan ko'rsatadi. Hech narsa o'rnatish shart emas — telefonda ham ishlaydi.

2.3 Tuzatilgan kod

Tuzatish ikki joyda: qty → quantity va formadagi satrni songa aylantirish (Number):

ts
type OrderItem = { dish: string; price: number; quantity: number };

function orderTotal(items: OrderItem[]): number {
  let total = 0;
  for (const item of items) {
    total += item.price * item.quantity;
  }
  return total;
}

function addTip(total: number, tip: number): number {
  return total + tip;
}

const order: OrderItem[] = [
  { dish: "Osh", price: 35000, quantity: 2 },
  { dish: "Ko'k choy", price: 5000, quantity: 2 },
];
const tipInput = "8000"; // formadan keldi — satr
const total = orderTotal(order);
console.log(total); // 80000
console.log(addTip(total, Number(tipInput))); // 88000

Endi kompilyator jim, natija to'g'ri: 80 000 va choy puli bilan 88 000 so'm.

Tekshirib ko'ring: Number(tipInput) ni olib tashlab, addTip(total, tipInput) deb yozsak, nima bo'ladi?

Javob

Kompilyator yana TS2345 beradi: tipInput — satr, tip parametri esa son kutadi. Bu kod ishga tushishidan oldin, siz faylni saqlagan zahotiyoq ko'rinadi. JavaScript'da esa xato faqat chekda, "800008000" ko'rinishida chiqardi.

3. Dinamik va statik tiplash

3.1 JavaScript: tur qiymatda

JavaScript'da o'zgaruvchining doimiy turi yo'q. Tur qiymatga yopishgan va faqat ishlash paytida ma'lum bo'ladi:

js
let price = 35000;
console.log(typeof price); // number
price = "35 000";
console.log(typeof price); // string

Bitta o'zgaruvchi avval son, keyin satr saqladi — JavaScript bunga e'tiroz bildirmaydi. typeof turni faqat shu daqiqada so'raydi. Buni dinamik tiplash (dynamic typing) deyishadi: turlar dastur ishlayotganda tekshiriladi, oldindan emas.

3.2 TypeScript: tur o'zgaruvchida

TypeScript'da o'zgaruvchining turi bor va u o'zgarmaydi:

ts
let price = 35000;
price = "35 000";

Xato:

text
TS2322: Type 'string' is not assignable to type 'number'.

Tarjimasi: "string turini number turiga berib bo'lmaydi". Biz price: number deb yozmadik-ku? TypeScript turni birinchi qiymatdan o'zi chiqardi: 35000 — son, demak price — son. Bu tur chiqarish (inference) deyiladi, uni Tur annotatsiyasi va tur chiqarish darsida batafsil ko'ramiz.

Bu statik tiplash (static typing): turlar dastur ishga tushishidan oldin, kodni o'qib tekshiriladi. "Statik" — "harakatsiz" degani: kompilyator kodni bajarmaydi, faqat matnini tahlil qiladi.

Hayotiy o'xshatish. Oshxonaga mahsulot keldi. Dinamik usul — oshpaz qozonga solayotganda "bu go'sht emas, lavlagi-ku" deb sezadi. Statik usul — mahsulot omborga kirayotgan joyda yorliq va nakladnoyga qarab tekshiriladi. Ikkinchisida xato ovqat pishmasdan ushlanadi.

Dinamik (JavaScript) Statik (TypeScript)
Tur qayerda qiymatda o'zgaruvchi va parametrda
Qachon tekshiriladi ishlash paytida ishga tushirishdan oldin
Xato qachon ko'rinadi o'sha qator bajarilganda faylni saqlaganda / tsc da
Xato kimga ko'rinadi ko'pincha mijozga dasturchiga

Tekshirib ko'ring: JavaScript'da typeof bor. Demak, JavaScript ham turlarni tekshiradi-ku. Unda nega uni dinamik deymiz?

Javob

typeof turni ishlash paytida so'raydi, va faqat siz uni yozgan joyda. Statik tekshiruv esa hamma qatorni kod ishga tushmasdan, avtomatik tekshiradi.

4. Superset: har qanday JavaScript — TypeScript

4.1 Til ustiga qo'shimcha

TypeScript JavaScript'ning ustqurmasi (superset). Ya'ni JavaScript'da bor hamma narsa TypeScript'da ham bor: let, funksiyalar, klasslar, async, Map. TypeScript faqat ustiga turlar sintaksisini qo'shadi.

flowchart TB
  subgraph TS["TypeScript"]
    T["turlar: price: number,<br/>type OrderItem"]
    subgraph JS["JavaScript"]
      J["let, function, class,<br/>async, Map, ..."]
    end
  end

Diagrammaga qarang: JavaScript doirasi TypeScript ichida to'liq turibdi. Siz o'rgangan 14 qismning hech biri bekor bo'lmaydi — o'sha bilim ustiga yangi qavat qo'shiladi.

4.2 Lekin .ts ga nomini o'zgartirish yetmaydi

.js faylni .ts deb qayta nomlasangiz, sintaksis jihatdan u to'g'ri TypeScript bo'ladi. Lekin kompilyator unga baribir e'tiroz bildirishi mumkin:

ts
function orderTotal(items) {
  return items.length;
}

Kompilyator:

text
TS7006: Parameter 'items' implicitly has an 'any' type.

Tarjimasi: "items parametri yashirincha any turini oldi". Bu xabarni ham 12/39 dan taniysiz. any — "istalgan narsa, tekshirma". Kompilyator items nima ekanini bilmaydi va sizdan aytishingizni so'raydi.

Bu kod ishlamaydi degani emas — u ishlaydi. Faqat TypeScript'ning qat'iy rejimi (strict) "shartnomasiz parametr" ga yo'l qo'ymaydi. TypeScript 7 da qat'iy rejim standart holda yoqilgan. Uni Strict bayroqlar oilasi darsida chuqur ko'ramiz.

Shuning uchun real loyihalar JavaScript'dan TypeScript'ga bir kunda emas, fayl-fayl o'tadi. vazifalar da ham shunday qilamiz. Bosqichma-bosqich ko'chishning to'liq usuli — JavaScript'dan TypeScript'ga ko'chish darsida.

5. Turlar o'chadi: TypeScript ishlash paytida yo'q

5.1 Brauzer TypeScript'ni bilmaydi

Brauzer faqat JavaScript'ni bajaradi. Shuning uchun .ts fayl ishlatilishidan oldin JavaScript'ga aylantiriladi. Bu ishni TypeScript kompilyatori — tsc qiladi. U ikki ishni bajaradi: avval turlarni tekshiradi, keyin turlarni olib tashlab, .js fayl yozadi.

Mana addTip ning kichik fayli:

ts
// Choy puli qo'shilgan jami summa
function addTip(total: number, tip: number): number {
  return total + tip;
}

console.log(addTip(80000, 8000)); // 88000

tsc undan yasagan JavaScript (TypeScript 7.0.2 ning haqiqiy chiqishi):

js
"use strict";
// Choy puli qo'shilgan jami summa
function addTip(total, tip) {
    return total + tip;
}
console.log(addTip(80000, 8000)); // 88000

Farqni qidiring: : number larning hammasi yo'qoldi. Mantiq bir harf ham o'zgarmadi. tsc yana ikki mayda ish qildi: qatorlarni 4 bo'sh joy bilan surdi va boshiga "use strict" (qat'iy rejim belgisi) qo'shdi. Izoh esa saqlandi.

Bu turlarning o'chishi (type erasure): turlar faqat tekshiruv uchun kerak, ishlayotgan dasturda ulardan iz qolmaydi.

flowchart LR
  A["kassa.ts<br/>kod + turlar"] --> B{"tsc:<br/>turlar to'g'rimi?"}
  B -- "xato" --> C["dasturchi tuzatadi"]
  C --> A
  B -- "to'g'ri" --> D["kassa.js<br/>faqat kod"]
  D --> E["brauzer yoki Node<br/>bajaradi"]

Sxemaga qarang: tekshiruv chap tomonda, kod ishga tushishidan oldin bo'ladi. O'ng tomonga — brauzerga turlar umuman yetib bormaydi.

5.2 Turni qiymat sifatida ishlatib bo'lmaydi

Turlar o'chgani uchun ularni kodda qiymat sifatida ishlatib bo'lmaydi:

ts
type OrderItem = { dish: string; price: number };
console.log(OrderItem);

Xato:

text
TS2693: 'OrderItem' only refers to a type, but is being used as a value here.

Tarjimasi: "OrderItem faqat turni bildiradi, lekin bu yerda qiymat sifatida ishlatilyapti". Ishlash paytida OrderItem degan narsa yo'q — u kompilyatsiyada o'chib ketadi. Xuddi shu sababdan typeof x === "OrderItem" ham ishlamaydi: typeof faqat JavaScript turlarini biladi ("number", "string", "object").

Tekshirib ko'ring: .ts faylda price: number yozildi. Brauzerga yetib borgan .js faylda bu tur haqida qanday ma'lumot qoladi?

Javob

Hech qanday. tsc turni tekshiradi va o'chiradi. .js faylda faqat price qoladi. Ishlash paytida price ga satr kelsa, hech kim to'xtatmaydi — buni keyingi bo'limda ko'ramiz.

6. TypeScript nimani ushlamaydi

Bu darsning eng muhim bo'limi shu. TypeScript sizning kodingizni tekshiradi. Kod ishlayotganda tashqaridan keladigan ma'lumotni esa ko'rmaydi.

6.1 Serverdan yoki xotiradan kelgan qiymat

«Bahor» saytida choy puli localStorage da saqlanadi deylik. U yerdan JSON.parse bilan o'qiladi:

ts
function addTip(total: number, tip: number): number {
  return total + tip;
}

const savedTip: number = JSON.parse('"8000"'); // aslida satr!
console.log(addTip(80000, savedTip)); // 800008000

Kompilyator bitta ham xato bermadi. Lekin natija — o'sha "800008000".

Nega? JSON.parse qaytaradigan qiymatning turi — any, ya'ni "istalgan narsa, tekshirma". Kompilyator matn ichida nima borligini bilmaydi: u faqat ishlash paytida ma'lum bo'ladi. Biz savedTip: number deb yozdik va kompilyator bizga ishondi. Turlar o'chdi, ishlash paytida esa satr keldi.

Xuddi shunday holatlar:

  • fetch bilan serverdan kelgan JSON (API ma'lumotlarini tiplash);
  • formadagi maydonlar, URL parametrlari, localStorage;
  • boshqa birovning kutubxonasi qaytargan qiymat.

Bularning hammasi dastur chegarasi — tashqi dunyo bilan uchrashadigan joy. U yerda turni ishlash paytida, kod bilan tekshirish kerak. Buni 12/39 da unknown va tekshiruvchi funksiya bilan qilgan edingiz. 15-qismda yana ikki usulni o'rganamiz: qo'lda yozilgan tekshiruv va Zod kutubxonasi (Zod va turni sxemadan chiqarish).

6.2 Mantiq xatosi

TypeScript turlarni tekshiradi, ma'noni emas:

ts
function applyDiscount(price: number, percent: number): number {
  return price - price * percent; // 10% — 0.1 bo'lishi kerak edi
}

console.log(applyDiscount(35000, 10)); // -315000

Turlar to'g'ri: ikkalasi ham son. Lekin chegirma noto'g'ri hisoblandi — osh narxi minus 315 000 so'm bo'lib qoldi. Bunday xatoni testlar ushlaydi, TypeScript emas. Shuning uchun TypeScript testlarning o'rnini bosmaydi — ular bir-birini to'ldiradi.

Xato turi Misol Kim ushlaydi
Maydon nomi item.qty TypeScript
Noto'g'ri turdagi argument addTip(total, "8000") TypeScript
Tashqaridan kelgan qiymat JSON.parse, fetch ishlash paytidagi tekshiruv
Mantiq price * percent testlar

Tadqiqot ham shuni ko'rsatadi. 2017-yilgi "To Type or Not to Type" ilmiy ishida GitHub'dagi tuzatilgan JavaScript xatolari olingan. Ularga turlar qo'shilganda TypeScript taxminan 15% ini ushlagan. Bu kam emas — har yettinchi xato mijozgacha yetmaydi. Lekin qolgan 85% uchun testlar, kod ko'rigi va ishlash paytidagi tekshiruv kerak.

Tekshirib ko'ring: Sardor: "Endi TypeScript bor, JSON.parse dan keyingi tekshiruvni olib tashlasak bo'ladi" dedi. U haqmi?

Javob

Yo'q. JSON.parse natijasi ishlash paytida ma'lum bo'ladi, TypeScript esa ishlash paytida yo'q — uning turlari o'chib ketgan. Tekshiruvni olib tashlasangiz, buzuq ma'lumot dasturga jim kirib keladi. TypeScript bilan ham tashqi ma'lumot chegarada, kod bilan tekshiriladi.

7. Foydasi va narxi

7.1 Nima beradi

  • Xato erta topiladi. Mijoz oldida emas, faylni saqlagan zahoti. Xato qanchalik erta topilsa, shunchalik arzon tuzatiladi.
  • Muharrir yordami. VS Code item. dan keyin dish, price, quantity ni taklif qiladi.
  • Xavfsiz o'zgartirish. quantity ni count ga qayta nomlasangiz, kompilyator eskicha qolgan hamma joyni ko'rsatadi.
  • Hujjat. addTip(total: number, tip: number): number — funksiya nimani kutishini kodning o'zi aytib turibdi.

7.2 Nima turadi

  • Qo'shimcha qadam. Brauzer .ts ni o'qimaydi — kodni avval JavaScript'ga aylantirish kerak. Buni keyingi darsda sozlaymiz.
  • O'rganish vaqti. Turlar tili katta: union, generics, utility types. 15-qism 47 ta darsdan iborat.
  • Turlarni yozish vaqti. Ayniqsa boshida. Keyin tezlashadi: TypeScript ko'p turni o'zi chiqaradi.
  • Uzun xato xabarlari. Murakkab turlarda xabar bir necha qator bo'ladi. Ularni o'qishni alohida o'rganamiz.
  • Soxta xotirjamlik. "Kompilyator jim — demak, hammasi to'g'ri" degan fikr. Yuqorida ko'rdingiz: bu rost emas.

Kichik skript uchun (bir martalik, 30 qatorli) JavaScript yetarli bo'lishi mumkin. Bir necha kishi bir necha oy ishlaydigan loyihada esa TypeScript deyarli har doim o'zini oqlaydi.

8. Ko'p uchraydigan xatolar

8.1 "TypeScript — boshqa til, JavaScript'ni unutsam bo'ladi"

Yo'q. TypeScript — JavaScript ustidagi qavat. Ishlash paytida baribir JavaScript ishlaydi: this, closure, event loop, 0.1 + 0.2 — hammasi o'sha. TypeScript xatosini tushunish uchun ham JavaScript'ni bilish kerak.

8.2 Turni ishlash paytida tekshirmoqchi bo'lish

ts
type Dish = { name: string; price: number };
const value: unknown = JSON.parse('{"name":"Osh","price":35000}');
if (value instanceof Dish) {
  console.log(value.name);
}

Xato:

text
TS2693: 'Dish' only refers to a type, but is being used as a value here.
TS18046: 'value' is of type 'unknown'.

instanceof ham, typeof ham ishlash paytida bajariladi, Dish esa u paytda yo'q. Ikkinchi xabar 12/39 dan tanish: tekshiruv ishlamadi, demak value hali ham unknown. Tuzatish: maydonlarni o'zingiz tekshiring (12/39 dagi "name" in raw va typeof raw.name usuli). Buni Custom type guard va assertion funksiyalar darsida qulay funksiyaga aylantiramiz.

8.3 Xato xabarini o'qimasdan "yo'qotish"

Boshlovchi qizil chiziqni ko'radi va uni tezroq yo'qotish uchun turini any qilib qo'yadi. Xato yo'qoladi, lekin tekshiruv ham yo'qoladi — siz JavaScript'ga qaytdingiz. To'g'ri yo'l: xabarni so'zma-so'z tarjima qiling. Odatda u muammoning o'zini aytib turadi: "qty yo'q", "satr berdingiz, son kerak".

9. Mashqlar

1-mashq (oson): Kim ushlaydi?

Har xato uchun ayting: TypeScript ishga tushirishdan oldin ushlaydimi yoki yo'qmi?

  1. menu.lenght (length o'rniga).
  2. addTip(total, "5000") — tip: number.
  3. Server {"price": "35000"} qaytardi, kod uni son deb hisoblaydi.
  4. Bron soatini tekshirishda hour < 22 o'rniga hour < 23 yozilgan.
Yechim
  1. Ushlaydi. Massivda lenght xususiyati yo'q — TS2551 ("Did you mean 'length'?").
  2. Ushlaydi. Satr son kutilgan parametrga berildi — TS2345.
  3. Ushlamaydi. Server javobi ishlash paytida keladi. Turlar o'shanda allaqachon o'chgan. Chegarada kod bilan tekshirish kerak.
  4. Ushlamaydi. Ikkalasi ham son, turlar to'g'ri. Bu mantiq xatosi — uni test ushlaydi (bron 22:00 gacha).

2-mashq (o'rta): Xabarni o'qing va tuzating

Kodni «TS Playground'da ochish» havolasi orqali oching. Kompilyator nima deydi? Tuzating.

ts
type Booking = { guestName: string; guests: number };

function bookingText(booking: Booking): string {
  return `${booking.name}: ${booking.guests} kishi`;
}

console.log(bookingText({ guestName: "Dilshod aka", guests: 4 }));

Bo'sh joyni to'ldiring: xato kodi — TS.

Yechim
ts
type Booking = { guestName: string; guests: number };

function bookingText(booking: Booking): string {
  return `${booking.name}: ${booking.guests} kishi`;
}

console.log(bookingText({ guestName: "Dilshod aka", guests: 4 }));

Kompilyator:

text
TS2339: Property 'name' does not exist on type 'Booking'.

Tarjimasi: "Booking turida name xususiyati yo'q". Maydon nomi guestName:

ts
type Booking = { guestName: string; guests: number };

function bookingText(booking: Booking): string {
  return `${booking.guestName}: ${booking.guests} kishi`;
}

const guest: Booking = { guestName: "Dilshod aka", guests: 4 };
console.log(bookingText(guest)); // Dilshod aka: 4 kishi

JavaScript'da bu kod xatosiz "undefined: 4 kishi" chiqarardi.

3-mashq (qiyin): JSDoc'dan TypeScript'ga

12/39 ning 1-mashqidagi funksiyani TypeScript sintaksisiga o'tkazing. JSDoc izohi o'rniga turlar kodda bo'lsin. time — ixtiyoriy, standart qiymati "19:00".

js
/**
 * @param {string} name mehmon ismi
 * @param {number} guests necha kishi
 * @param {string} [time] standart — "19:00"
 * @returns {string}
 */
function bookingText(name, guests, time = "19:00") {
  return `${name}: ${guests} kishi, soat ${time}`;
}

Ishora: TypeScript'da tur parametr nomidan keyin, ikki nuqta bilan yoziladi (name: string). Standart qiymatli parametr o'z-o'zidan ixtiyoriy bo'ladi.

Yechim
ts
function bookingText(
  name: string,
  guests: number,
  time: string = "19:00",
): string {
  return `${name}: ${guests} kishi, soat ${time}`;
}

console.log(bookingText("Malika", 4));
console.log(bookingText("Bobur", 2, "20:30"));

Konsolda:

text
Malika: 4 kishi, soat 19:00
Bobur: 2 kishi, soat 20:30

Har @param qatori parametrning yoniga ko'chdi, @returns — qavsdan keyingi : string ga. Izohdagi tavsiflar ("mehmon ismi") kerak bo'lsa, oddiy izoh bo'lib qolishi mumkin. Turni esa endi kodning o'zi aytadi.

Aslida time ning turini yozmasa ham bo'ladi: TypeScript uni "19:00" dan chiqaradi. Buni keyingi darslarda ko'ramiz.

4-mashq: Amaliy tajriba — xato daftari

15-qism davomida uchragan har yangi kompilyator xabarini bitta jadvalga yozib boring. Qism oxirida bu sizning shaxsiy "xato lug'atingiz" bo'ladi.

kurs/mashqlar/15/XATOLAR.md faylini yarating. Ustunlar: kod, inglizcha xabar (qisqa), o'zbekcha ma'nosi, tipik tuzatish. Bugungi to'rtta xabarni yozing: TS2339, TS2345, TS2322, TS7006. Har biri uchun bu darsdagi misolni Playground'da ochib, xabarni o'z ko'zingiz bilan ko'ring.

Yechim
text
# Xato daftari (15-qism)

| Kod | Xabar | Ma'nosi | Tuzatish |
|---|---|---|---|
| TS2339 | Property 'x' does not exist on type 'T' | turda bunday maydon yo'q | nomini tekshiring |
| TS2345 | Argument of type 'A' is not ... | argument turi mos emas | qiymatni aylantiring |
| TS2322 | Type 'A' is not assignable to type 'B' | o'zgaruvchiga boshqa tur | turini moslang |
| TS7006 | Parameter 'x' implicitly has an 'any' type | parametr turi yozilmagan | turini yozing |
bash
git add 15/XATOLAR.md
git commit -m "15/01: xato daftari — birinchi to'rt xabar"

Keyingi darsda bu jadvalga tsc ning terminaldagi xabarlari qo'shiladi. Qism oxirida, TS xato xabarlarini o'qish darsida, jadvalingizni darsdagi ro'yxat bilan solishtirasiz.

10. Real ishda

  • Ko'p yangi loyihalar TypeScript'da boshlanadi. GitHub'ning Octoverse 2025 hisobotiga ko'ra (2025-yil 28-oktabr), 2025-yil avgustida TypeScript GitHub'dagi eng ko'p ishlatiladigan tilga aylangan — oylik ishtirokchilar soni bo'yicha Python va JavaScript'dan o'tgan. Hisobot sabab sifatida freymvorklarni ham keltiradi: Next.js, Astro, SvelteKit, Angular yangi loyihani standart holda TypeScript'da yaratadi.
  • Vakansiyalar. Frontend va Node vakansiyalarining katta qismida "TypeScript" talab sifatida yoziladi. React (17-qismdan) va Node server (24-qismdan) darslarimiz ham TypeScript bilan boradi — hozir bilish shart emas.
  • Intervyu savollari: "Statik va dinamik tiplash farqi nima?", "TypeScript ishlash paytida turlarni tekshiradimi?", "any nima va nega xavfli?" — bu darsdan keyin har biriga javob bera olasiz.

Xulosa

  • TypeScript — JavaScript ustiga turlar qo'shilgan til (superset). Har qanday JavaScript kodi uning ichida bor.
  • Statik tiplash — turlar kod ishga tushishidan oldin tekshiriladi. JavaScript'da esa tur qiymatda va faqat ishlash paytida ma'lum.
  • Kompilyator xabari — kod (TS2339) va inglizcha matn. Uni so'zma-so'z tarjima qiling — odatda muammoni aytib turadi.
  • Turlar o'chadi (type erasure): tsc tekshirib, oddiy JavaScript yozadi. Ishlash paytida TypeScript yo'q.
  • Shuning uchun tashqi ma'lumot (JSON.parse, fetch, forma) chegarada kod bilan tekshiriladi, mantiq xatolarini esa testlar ushlaydi.

Keyingi dars: TypeScript'ni o'rnatish va ishga tushirish — tsc ni o'rnatamiz, birinchi .ts faylni JavaScript'ga aylantiramiz va Node 24 da to'g'ridan-to'g'ri ishga tushiramiz.

Manbalar

  • TypeScript hujjatlari: "TypeScript for JavaScript Programmers", "The Basics" — typescriptlang.org/docs
  • TypeScript blogi: "Announcing TypeScript 7.0" (2026-07-08) — devblogs.microsoft.com/typescript/announcing-typescript-7-0/
  • Z. Gao, C. Bird, E. Barr. "To Type or Not to Type: Quantifying Detectable Bugs in JavaScript", ICSE 2017
  • GitHub: "Octoverse: A new developer joins GitHub every second as AI leads TypeScript to #1" (2025-10-28) — github.blog
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
TypeScript nima va nega kerak: xatoni kod ishga tushmasdan topish — IlmHamroh