TypeScript any, unknown va never tiplari

Serverdan kelgan ma’lumot tipi oldindan noma’lum. Bunday qiymatni qanday e’lon qilish kerak?

Eng oson yo’l — any. U ishlaydi, lekin TypeScript’ni butunlay o’chirib qo’yadi. Bu darsda nega shunday bo’lishini va to’g’ri yechim nima ekanini ko’ramiz.

any — tekshiruvni o’chiradi

let risky: any = "salom";

console.log(risky.toFixed(2));

Bu kod kompilyatsiyadan muammosiz o’tadi. Xato yo’q, ogohlantirish yo’q.

Ishga tushirilganda esa:

TypeError: risky.toFixed is not a function

Mana muammo: any ishlatilgan joyda TypeScript’dan hech qanday foyda qolmaydi. Siz tiplar uchun kod yozdingiz, lekin himoya olmadingiz.

unknown — xavfsiz muqobil

unknown ham har qanday qiymatni qabul qiladi, lekin uni ishlatishga ruxsat bermaydi:

const value: unknown = "Salom";
console.log(value.length);
example.ts(2,13): error TS18046: 'value' is of type 'unknown'.

Farqni jadvalda ko’ring:

Amal any unknown
Har qanday qiymat berish
Tekshiruvsiz ishlatish ✅ (xavfli)
Tekshiruvdan keyin ishlatish

unknown “bilmayman” deyishning halol usuli. any esa “tekshirma” degani.

unknown bilan qanday ishlash

Tekshiruvdan keyin TypeScript ruxsat beradi:

function parseJson(raw: string): unknown {
  return JSON.parse(raw);
}

const data = parseJson('{"name":"Aziz"}');

if (typeof data === "object" && data !== null && "name" in data) {
  console.log("Nom topildi:", data.name);
} else {
  console.log("Kutilgan shakl emas");
}
Nom topildi: Aziz

Tekshiruv uch bosqichli va har biri zarur:

  1. typeof data === "object" — obyektmi?
  2. data !== nulltypeof null ham "object" beradi, shuning uchun alohida tekshiriladi;
  3. "name" in data — kerakli maydon bormi?

Ma’lumot turlari darsidagi typeof null === "object" xususiyati aynan shu yerda ahamiyatga ega bo’ladi.

JSON.parse doim ishonchsiz

const data = JSON.parse('{"age": "yigirma"}');

JSON.parse any qaytaradi. Ya’ni serverdan kelgan har qanday ma’lumot, agar tekshirilmasa, tiplar himoyasidan chetda qoladi.

never — hech qachon qaytmaydigan

function fail(message: string): never {
  throw new Error(message);
}

Bu funksiya hech qachon qiymat qaytarmaydi: u har doim xato tashlaydi.

never ni void bilan aralashtirmang:

Tip Ma’nosi
void Funksiya tugaydi, lekin qiymat qaytarmaydi
never Funksiya umuman tugamaydi

never barcha variantlar tugaganini bildiradi

never ning eng foydali ishlatilishi — union to’liq qayta ishlanganini tekshirish:

function fail(message: string): never {
  throw new Error(message);
}

function handle(value: string | number): string {
  if (typeof value === "string") return value;
  if (typeof value === "number") return value.toFixed(1);
  return fail("Kutilmagan tip");
}

console.log(handle("salom"), handle(3.14159));
salom 3.1

Oxirgi return ga hech qachon yetib borilmaydi: string va number tekshirilgach, boshqa variant qolmadi. Shu joyda value ning tipi never bo’ladi.

Foydasi keyin ko’rinadi. Union’ga yangi variant qo’shsangiz — masalan boolean — TypeScript oxirgi qatorda xato beradi va yangi holatni qayta ishlashni unutmasligingizni ta’minlaydi.

catch bloki va unknown

strict rejimida catch dagi qiymat tipi noma’lum:

try {
  fail("Xato yuz berdi");
} catch (error) {
  if (error instanceof Error) {
    console.log("Ushlandi:", error.message);
  }
}
Ushlandi: Xato yuz berdi

Sabab mantiqiy: JavaScript’da throw bilan har qanday qiymatni tashlash mumkin — matn ham, son ham. Shuning uchun error.message ni to’g’ridan-to’g’ri o’qib bo’lmaydi.

instanceof Error tekshiruvi xatolar darsidagi naqshni TypeScript’da majburiy qiladi.

Qachon any ishlatish mumkin

Deyarli hech qachon. Lekin ikki holat bor:

  1. Eski JavaScript kodini bosqichma-bosqich ko’chirayotganda — vaqtincha, izoh bilan;
  2. Tip tavsifi yo’q kutubxona bilan ishlaganda — o’rab, faqat chegarada.

Ikkala holatda ham any vaqtinchalik bo’lishi kerak.

Amaliy mashq

  1. any tipidagi o’zgaruvchiga matn berib, unda toFixed() chaqiring va kompilyatsiya o’tishini, ishga tushirishda xato chiqishini solishtiring;
  2. Xuddi shu kodni unknown bilan yozib, TS18046 xatosini o’qing;
  3. unknown qiymatini typeof bilan tekshirib, so’ng ishlatib ko’ring;
  4. JSON.parse natijasini as bilan noto’g’ri tipga majburlab, natijada NaN olinishini kuzating;
  5. never qaytaradigan funksiya yozib, uni union tekshiruvining oxirgi shoxida ishlating;
  6. Tip yozilmagan parametrli funksiya yozib, TS7006 ogohlantirishini chaqiring.

4-qadam eng muhimi: u tiplar ishlash paytida tekshirilmasligini — TypeScript’ning asosiy chegarasini — amalda ko’rsatadi.

Qisqacha xulosa

  • any tekshiruvni o’chiradi va tegib o’tgan qiymatlarga tarqaladi.
  • unknown ham har qanday qiymatni oladi, lekin uni ishlatishdan oldin tekshirishni talab qiladi.
  • Noma’lum ma’lumot uchun doim unknown tanlanadi, any emas.
  • as yozuvi ma’lumotni tekshirmaydi — u faqat TypeScript’ga “ishon” deydi.
  • Tiplar ishlash paytida yo’q: tashqaridan kelgan ma’lumot qo’lda tekshiriladi.
  • never — qiymat qaytarmaydigan funksiya va barcha variantlar tugagan joy tipi.
  • strict rejimida catch dagi qiymat unknown bo’ladi va instanceof bilan tekshiriladi.

Keyingi darsda generiklar — tipni parametr sifatida uzatish.

Bu dars foydali bo'ldimi?

marta ko'rildi