type kalit so'zi, union (|) va intersection (&) turlari, hamda interface va type orasidagi amaliy farqlar (declaration merging) — chuqur test va debugging mashqlari bilan.
Bu bob — interfeysdan tashqari, TypeScript'da tip yaratishning yana bir kuchli usuli bo'lgan type kalit so'zini, hamda turlarni birlashtirish (union) va kesishtirish (intersection) usullarini chuqur yoritadi.
type — istalgan turga (primitiv, obyekt, union va h.k.) "taxallus" (nom) berish imkonini beradi.
index.tsTypeScripttype ID = string | number;type Point = { x: number; y: number };type Callback = (data: string) => void;let userId: ID = 42;let userId2: ID = "abc-123";const origin: Point = { x: 0, y: 0 };
index.tsTypeScript// Interface — faqat obyekt shakllari uchun, extends orqali kengaytiriladiinterface User { name: string; }interface Admin extends User { role: string; }// Type — istalgan tur uchun, & orqali birlashtiriladitype UserT = { name: string; };type AdminT = UserT & { role: string; };
Union type — qiymat bir nechta turdan BIRI bo'lishi mumkinligini bildiradi.
index.tsTypeScripttype Status = "loading" | "success" | "error";function handleStatus(status: Status) {if (status === "loading") {console.log("Yuklanmoqda...");} else if (status === "success") {console.log("Muvaffaqiyatli!");} else {console.log("Xatolik yuz berdi");}}handleStatus("loading"); // TO'G'RIhandleStatus("pending"); // XATO: 'pending' 'Status'ga mos kelmaydi
⚠️ Common Mistake
Union type'dagi barcha variantlarga umumiy bo'lmagan metod/xususiyatga to'g'ridan-to'g'ri murojaat qilish — TypeScript bunga yo'l qo'ymaydi, chunki qiymat variantlardan qaysi biri ekani aniq emas.
index.tsTypeScriptfunction printLength(value: string | number) {console.log(value.length); // XATO: 'number' turida 'length' mavjud emas}
Intersection type — bir nechta turni birlashtirib, natijada barcha turlarning xususiyatlariga BIRDANIGA ega bo'lgan yangi tur yaratadi.
index.tsTypeScripttype Timestamped = { createdAt: Date; updatedAt: Date };type Named = { name: string };type Article = Timestamped & Named & {content: string;};const article: Article = {name: "Birinchi maqola",content: "Maqola matni...",createdAt: new Date(),updatedAt: new Date(),};
💡 Key Idea
Union (|) — "YOKI" degan ma'noni bildiradi (bittasidan biri), Intersection (&) — "VA" degan ma'noni bildiradi (barchasi birgalikda).
Ko'p hollarda ikkalasi ham deyarli bir xil ishlaydi, lekin bir nechta amaliy farq mavjud:
type esa yo'q.index.tsTypeScriptinterface Window {title: string;}interface Window {update(newTitle: string): void;}// Natijada Window — ikkala maydonga ham ega bo'ladi
Task: "pending" | "approved" | "rejected" union type'iga ega RequestStatus type alias yarating va uni qabul qiluvchi funksiya yozing.
Task: WithId (id: number) va WithTimestamp (createdAt: Date) type'larini yaratib, ularni intersection orqali birlashtiring va yangi obyekt yarating.
Task: success: true yoki success: false holatlariga qarab turli maydonlarga ega bo'lgan ApiResponse union type'ini yarating (bu — keyingi bobda chuqur o'rganiladigan "discriminated union"ning kirish darajasi).
index.tsTypeScripttype Shape = { kind: "circle"; radius: number } | { kind: "square"; side: number };function getArea(shape: Shape) {return shape.radius * shape.radius * 3.14;}
🧠 Think first! Bu compile vaqtida xato beradimi?
<details> <summary>Answer</summary> Ha, xato beradi: `Property 'radius' does not exist on type '{ kind: "square"; side: number }'`.Why?
shape — union type, u ikkala variantdan biri bo'lishi mumkin. shape.radiusga to'g'ridan-to'g'ri murojaat qilish — agar shape aslida "square" bo'lsa, radius mavjud emasligini hisobga olmaydi. Bu muammoni yechish uchun shape.kindni tekshirish (type narrowing) kerak — bu PART 9'da chuqur o'rganiladi.
index.tsTypeScriptinterface Point { x: number; y: number; }interface Point { z: number; }const p: Point = { x: 1, y: 2 };
Your Task: Bu kod nega xato beradi?
<details> <summary>Solution</summary> Ikkinchi `interface Point` e'loni — declaration merging orqali birinchisi bilan birlashadi, natijada `Point` — `{ x: number; y: number; z: number }` bo'lib qoladi. `p` obyektida `z` yo'q, shuning uchun xato: `Property 'z' is missing`. Agar bu `type` bilan yozilganda (`type Point = {...}`), ikkinchi e'lon "Duplicate identifier" xatosini bergan bo'lardi — chunki `type` declaration merging'ni qo'llab-quvvatlamaydi. </details>type — istalgan turga (union, intersection, primitiv va h.k.) nom berish imkonini beradi. Union (|) — "YOKI", Intersection (&) — "VA" degan ma'noni bildiradi. interface — faqat obyekt shakllari uchun, lekin declaration merging'ni qo'llab-quvvatlaydi; type — universal, lekin merging'siz.
type — union/intersection va murakkab turlar uchun zarurinterface — declaration merging, type — universallik beradiindex.tsTypeScripttype ID = string | number;type Status = "loading" | "success" | "error";type Combined = TypeA & TypeB;type ApiResponse = { success: true; data: T } | { success: false; error: string };
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: