any, unknown, never — qachon qaysi, xavflari
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