Union tiplar: "shulardan biri"
Union qiymatga bir nechta tiplardan biri bo'lishga imkon beradi. Uni | (quvur, "yoki" deb o'qiladi) yordamida yozasiz:
let id: string | number;
id = "abc"; // ok
id = 123; // ok
id = true; // Error: boolean isn't part of the unionUnion'lar hamma joyda uchraydi: yo'q bo'lishi mumkin bo'lgan qiymat (string | null), ikkala shaklda ham bo'lishi mumkin bo'lgan ID (string | number), bir nechta ko'rinishda keladigan sozlama. Ular ma'lumotlarni bitta tipga majburan tiqishtirish yoki anyga qaytish o'rniga, haqiqiy ma'lumotni halol tarzda tavsiflashga imkon beradi.
Literal tiplar: aniq qiymatlar
Literal tip stringdan ham aniqroq — bu bitta aniq qiymat:
let direction: "left";
direction = "left"; // ok
direction = "right"; // Error: only "left" is allowedO'z-o'zidan bu foydali emas. Literal'lar ularni birlashtirib, aniq belgilangan variantlar to'plamini tavsiflaganda o'zini ko'rsatadi:
type Direction = "up" | "down" | "left" | "right";
function move(dir: Direction) { /* ... */ }
move("up"); // ok
move("upward"); // Error: not one of the fourBu "ma'lum bir to'plamdan biri"ni modellashtirishning idiomatik TypeScript usuli — oddiy string'larni uzatib, chaqiruvchilar ularni to'g'ri yozishiga umid qilishdan ko'ra ancha toza va xavfsizroq. Siz variantlar uchun avtomatik to'ldirishni (autocomplete) olasiz va xato terilgan so'zlar xatolarga aylanadi.
Number literal'lar ham xuddi shunday ishlaydi:
type DiceRoll = 1 | 2 | 3 | 4 | 5 | 6;Union bilan xavfsiz ishlash
Qiymat bir nechta tipda bo'lishi mumkin bo'lganda, TypeScript ularning faqat ba'zilarida mavjud bo'lgan metoddan foydalanishga ruxsat bermaydi:
function printId(id: string | number) {
id.toUpperCase(); // Error — numbers don't have toUpperCase
}Avval qaysi tip bilan ish ko'rayotganingizni isbotlashingiz kerak. Buni narrowing deb ataladi va kundalik vosita typeof tekshiruvidir:
function printId(id: string | number) {
if (typeof id === "string") {
console.log(id.toUpperCase()); // here, id is a string
} else {
console.log(id.toFixed(2)); // here, id is a number
}
}if ichida TypeScript id string ekanini biladi, shuning uchun string metodlariga ruxsat beriladi. else ichida esa u id number ekanini biladi. TypeScript sizning tekshiruvlaringizni kuzatadi va tipni tarmoq-ba-tarmoq toraytiradi — bu control-flow analysis deb ataladigan xususiyat.
Literal union bilan narrowing
Literal'lar union'lari uchun oddiy === tekshiruvi ham toraytiradi:
type Status = "loading" | "success" | "error";
function render(status: Status) {
if (status === "loading") {
return "Please wait...";
}
if (status === "error") {
return "Something broke";
}
return "Done!"; // status is "success" here
Bu naqsh — string literal'lardan iborat union va uni toraytiradigan tekshiruvlar — TypeScript'dagi eng keng tarqalgan va eng sevimli shakllardan biridir. Ancha chuqurroq versiyasini (discriminated unions) o'rta darajada ko'rasiz.
Intervyu maslahatlari
- Union (
A | B) qiymat bir nechta tipdan biri ekanini bildiradi; uni "yo'q bo'lishi mumkin" yoki "ikkala shakldan biri" holatlar uchun ishlating. - Literal tip — bu bitta aniq qiymat; belgilangan variantlar to'plamini modellashtirish uchun literal'larni birlashtiring.
- Union'ni toraytirmaguningizcha unda tipga xos metodni chaqira olmaysiz —
typeof(yoki literal'lar uchun===) dan foydalaning. - Narrowing ishlaydi, chunki TypeScript sizning
iftekshiruvlaringizni kuzatadi (control-flow analysis).
Muhokama
Hozircha izoh yo‘q
Muhokamada qatnashish uchun tizimga kiring.
KirishHozircha fikr yo‘q
Birinchi bo‘lib yozing: bu mavzuda nima yordam berdi — yoki nimani aniqroq tushuntirish kerak.