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:
typeof data === "object"— obyektmi?data !== null—typeof nullham"object"beradi, shuning uchun alohida tekshiriladi;"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:
- Eski JavaScript kodini bosqichma-bosqich ko’chirayotganda — vaqtincha, izoh bilan;
- Tip tavsifi yo’q kutubxona bilan ishlaganda — o’rab, faqat chegarada.
Ikkala holatda ham any vaqtinchalik bo’lishi kerak.
Amaliy mashq
anytipidagi o’zgaruvchiga matn berib, undatoFixed()chaqiring va kompilyatsiya o’tishini, ishga tushirishda xato chiqishini solishtiring;- Xuddi shu kodni
unknownbilan yozib,TS18046xatosini o’qing; unknownqiymatinitypeofbilan tekshirib, so’ng ishlatib ko’ring;JSON.parsenatijasiniasbilan noto’g’ri tipga majburlab, natijadaNaNolinishini kuzating;neverqaytaradigan funksiya yozib, uni union tekshiruvining oxirgi shoxida ishlating;- Tip yozilmagan parametrli funksiya yozib,
TS7006ogohlantirishini chaqiring.
4-qadam eng muhimi: u tiplar ishlash paytida tekshirilmasligini — TypeScript’ning asosiy chegarasini — amalda ko’rsatadi.
Qisqacha xulosa
anytekshiruvni o’chiradi va tegib o’tgan qiymatlarga tarqaladi.unknownham har qanday qiymatni oladi, lekin uni ishlatishdan oldin tekshirishni talab qiladi.- Noma’lum ma’lumot uchun doim
unknowntanlanadi,anyemas. asyozuvi 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.strictrejimidacatchdagi qiymatunknownbo’ladi vainstanceofbilan tekshiriladi.
Keyingi darsda generiklar — tipni parametr sifatida uzatish.