in operator guard — xususiyat mavjudligini tekshirish

~15 daq · TypeScript · Type Narrowing

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