in operator guard — xususiyat mavjudligini tekshirish
Ikkita plain ob'ekt (class emas, interface) turi bor — har birida o'ziga xos xususiyat. instanceof ishlamaydi (class emas). Qanday ajratish?
type Muvaffaqiyat = { natija: string };
type Xato = { xabar: string };
function qayta(j: Muvaffaqiyat | Xato): string {
return j.natija; // ❌ — Xato da natija yo'q
}
in operator — ob'ektda xususiyat bor-yo'qligini tekshirish orqali ajratadi.
in operator
"xususiyat" in ob'ekt — TypeScript bu blokda shu xususiyat bor turni tanlaydi:
function qayta(j: Muvaffaqiyat | Xato): string {
if ("natija" in j) {
return j.natija; // ✅ j: Muvaffaqiyat
}
return j.xabar; // ✅ j: Xato
}
Ko'p variantli union
type Karta = { tur: "karta"; raqam: string };
type Naqd = { tur: "naqd"; summa: number };
type PayPal = { tur: "paypal"; email: string };
type Tolov = Karta | Naqd | PayPal;
function tolovMatni(t: Tolov): string {
if ("raqam" in t) return `Karta: ${t.raqam}`;
if ("email" in t) return `PayPal: ${t.email}`;
return `Naqd: ${t.summa}`;
}
Noyob xususiyat muhim
Noyob xususiyat — faqat bir turda bor bo'lgan xususiyat:
type A = { id: number; ism: string };
type B = { id: number; yosh: number };
function fn(x: A | B) {
if ("id" in x) {
x; // A | B — id ikkalasida, ajratilmadi!
}
if ("yosh" in x) {
x; // B ✅ — yosh faqat B da
}
}
typeof / instanceof / in — qachon qaysi?
typeof → string, number, boolean, undefined (primitive)
instanceof → class instansi (Error, Date, MyClass)
"prop" in → plain ob'ekt, interface (noyob xususiyat orqali)
function fn(x: string | Date | { ism: string } | null) {
if (typeof x === "string") { /* string */ }
if (x instanceof Date) { /* Date */ }
if (x && "ism" in x) { /* {ism} */ }
if (x === null) { /* null */ }
}
Tez-tez uchraydigan xatolar
null/undefined bilan in ishlatish:
function fn(x: { ism: string } | null) {
if ("ism" in x) { } // ❌ — x null bo'lishi mumkin, runtime xato
if (x && "ism" in x) { } // ✅ — avval null tekshirish
}
Xulosa
if ("xususiyat" in ob'ekt) {
// shu xususiyat bor turlar qoladi
}
// Qoidalar:
// 1. Noyob xususiyat — faqat bir turda bor
// 2. null/undefined dan avval tekshirish: x && "prop" in x
// 3. class uchun instanceof afzalroq
Keyingi dars
30-dars: Discriminated union — tag field pattern