any, unknown, never — qachon qaysi, xavflari

~20 daq · TypeScript · Asosiy Turlar

API dan javob keldi. Nima kelishini bilmaysiz — tezda any qo'ydingiz:

const javob: any = await fetch("/api/user").then(r => r.json());
console.log(javob.ism.toUpperCase()); // ishladi

Olti oy o'tdi. Production da xato:

TypeError: Cannot read properties of undefined (reading 'toUpperCase')

ism ba'zan undefined kelayotgan ekan. TypeScript buni ko'rsatmadi — any bilan tekshiruvni o'chirib qo'ygandingiz.


any — tekshiruvni o'chirish

any — TypeScript ni o'sha o'zgaruvchi uchun butunlay o'chirish. Xohlagan tur, xohlagan metod — hamma ruxsat, hech narsa tekshirilmaydi.

let x: any = "salom";
x = 42;
x = true;
x.mavjud_bolmagan_metod(); // TypeScript jim — xato runtime da bilinadi

Qachon ishlatiladi: eski JavaScript loyihasini TypeScript ga asta-sekin o'tkazayotganda — vaqtincha. Maqsad keyinchalik any ni to'g'ri turlarga almashtirish.

Doimiy any — TypeScript dan foydalanib, himoyasidan voz kechish.


unknown — xavfsiz noma'lum

unknown ham "nima ekanini bilmayman" deydi. Lekin any dan farqli — ishlatishdan oldin tekshirishni majburiy qiladi.

let a: any     = "salom";
let b: unknown = "salom";

a.toUpperCase(); // ✅ any — xavfli, lekin TypeScript ruxsat beradi
b.toUpperCase(); // ❌ unknown — tekshirmasdan bo'lmaydi

Tekshirgandan keyin — ruxsat:

if (typeof b === "string") {
  b.toUpperCase(); // ✅ — bu blokda b aniq string
}

catch blokida — eng to'g'ri joy:

try {
  // ...
} catch (xato: unknown) {
  if (xato instanceof Error) {
    console.error(xato.message); // ✅ — tekshirildi
  }
}

any vs unknown:

any      →  "noma'lum, va beparvo"      — tekshiruv yo'q
unknown  →  "noma'lum, lekin ehtiyotkor" — ishlatishdan oldin tekshir

never — hech qachon bo'lmaydigan holat

never — bu turda hech qachon qiymat bo'lmaydi. Ikki holat bor.

Holat 1 — funksiya hech qachon tugamaydi:

function xatoTashla(xabar: string): never {
  throw new Error(xabar); // bu yerdan natija qaytmaydi
}

Holat 2 — barcha holatlar ko'rilganini kafolatlash:

To'lov turi qo'shildi — lekin switch da ko'rilmadi. never bilan TypeScript buni darhol ko'rsatadi:

type TolovTuri = "karta" | "naqd" | "online";

function tolovQayta(tur: TolovTuri): string {
  switch (tur) {
    case "karta":  return "Karta orqali";
    case "naqd":   return "Naqd pul";
    case "online": return "Online to'lov";
    default:
      const _tekshiruv: never = tur; // ← "crypto" qo'shilsa xato shu yerda
      throw new Error(`Ko'rilmagan: ${tur}`);
  }
}

TolovTuri ga "crypto" qo'shilganda switch da ko'rilmasa — muharrir darhol qizil chiziq. Unutib ketish imkoni yo'q.


Tez-tez uchraydigan xatolar

any ni muammodan qochish uchun ishlatish:

// ❌ — qiyinlikdan qochish
function hisoblash(a: any, b: any): any {
  return a + b; // string concat? son qo'shish? bilinmaydi
}

// ✅
function hisoblash(a: number, b: number): number {
  return a + b;
}

unknown ni as any bilan chetlab o'tish:

let x: unknown = "salom";

(x as any).toUpperCase(); // ❌ — unknown ning maqsadini yo'qotadi

if (typeof x === "string") {
  x.toUpperCase(); // ✅
}

Xulosa

tur      xavf     tekshiruv             qachon ishlatiladi
───────  ───────  ────────────────────  ──────────────────────────────
any      yuqori   yo'q                  JS → TS migratsiya, vaqtincha
unknown  past     majburiy (typeof...) API javob, catch bloki
never    —        —                     throw funksiya, switch exhaustive

any — oxirgi chora. unknown — noma'lum narsa uchun to'g'ri tur. never — hech qachon bo'lmaydigan holat va barcha variantlar ko'rilganini kafolatlash.


Keyingi dars

8-dars: Array — T[] va Array<T>, readonly array