TypeScript union va literal tiplar
Maqola holati faqat uchta qiymatdan biri bo’lishi mumkin: qoralama,
chop etilgan yoki arxivlangan. Uni string deb e’lon qilsangiz,
"chop etildi" yoki "Draft" kabi xato yozuv ham o’tib ketadi.
TypeScript ruxsat etilgan qiymatlarni aniq sanab qo’yishga imkon beradi.
Union — bir nechta tipdan biri
Vertikal chiziq “yo bu, yo u” degani:
type Identifier = string | number;
const textCode: Identifier = "A-12";
const numberCode: Identifier = 42;
console.log(textCode, numberCode);
A-12 42
string | null yozuvini asosiy tiplar
darsida ko’rgansiz — u ham union edi.
Union bilan ishlashda chegara bor
Union qiymatida faqat hamma tipga umumiy bo’lgan narsalarni ishlatish mumkin:
function format(value: string | number): string {
return value.toUpperCase();
}
example.ts(2,16): error TS2339: Property 'toUpperCase' does not exist on type 'string | number'.
Property 'toUpperCase' does not exist on type 'number'.
Xabarning ikkinchi qatori sababni aniq aytadi: number da
toUpperCase metodi yo’q. TypeScript value hozir qaysi tip ekanini
bilmaydi, shuning uchun xavfsiz yo’lni tanlaydi.
Toraytirish — tipni aniqlashtirish
Yechim: if bilan tipni tekshirish. TypeScript tekshiruvni tushunadi
va shoxlar ichida tipni aniqlashtiradi:
function describe(id: string | number): string {
if (typeof id === "string") {
return `Matnli kod: ${id.toUpperCase()}`;
}
return `Raqamli kod: ${id.toFixed(0)}`;
}
console.log(describe("a-12"));
console.log(describe(42));
Matnli kod: A-12
Raqamli kod: 42
if ichida id — aniq string, shuning uchun toUpperCase ishlaydi.
if dan keyin esa faqat number qoladi va toFixed ruxsat etiladi.
Bu mexanizm TypeScript’ning eng kuchli tomoni: siz odatdagidek tekshiruv yozasiz, tip esa o’zi to’g’rilanadi.
Literal tip — aniq qiymatlar ro’yxati
Union ichida tip nomi emas, qiymatning o’zi turishi mumkin:
type Status = "draft" | "published" | "archived";
let articleStatus: Status = "draft";
articleStatus = "published";
Ro’yxatda yo’q qiymat o’tmaydi:
articleStatus = "archived2";
example.ts(5,1): error TS2820: Type '"archived2"' is not assignable to type 'Status'. Did you mean '"archived"'?
Xabar oxiridagi savolga e’tibor bering: yozuv ruxsat etilgan qiymatga yaqin bo’lsa, TypeScript to’g’ri variantni o’zi taklif qiladi.
Foydasi kundalik: muharrir articleStatus = " yozganingizda uchta
mumkin qiymatni o’zi taklif qiladi. Imlo xatosi imkonsiz bo’lib qoladi.
Literal union bilan funksiya
type Status = "draft" | "published" | "archived";
function statusLabel(status: Status): string {
if (status === "draft") return "Qoralama";
if (status === "published") return "Chop etilgan";
return "Arxivlangan";
}
console.log(statusLabel("draft"));
console.log(statusLabel("archived"));
Qoralama
Arxivlangan
Funksiyaga "nashr" kabi qiymat berib bo’lmaydi — xato e’lon paytida
chiqadi.
Ajratuvchi maydonli union
Eng foydali naqsh: har variantda bir xil nomli maydon bo’ladi va uning qiymati variantni ajratib turadi.
type Shape =
| { kind: "circle"; radius: number }
| { kind: "rectangle"; width: number; height: number };
function area(shape: Shape): number {
if (shape.kind === "circle") {
return Math.PI * shape.radius ** 2;
}
return shape.width * shape.height;
}
console.log(area({ kind: "circle", radius: 2 }).toFixed(2));
console.log(area({ kind: "rectangle", width: 3, height: 4 }));
12.57
12
kind maydonini tekshirgach, TypeScript qaysi variant ekanini biladi:
birinchi shoxda radius, ikkinchisida width va height mavjud.
null bilan toraytirish
Amalda eng ko’p uchraydigan holat — funksiya natija topmasligi mumkin:
function findUser(name: string): string | null {
if (name === "Aziz") return "Aziz Karimov";
return null;
}
const found = findUser("Bobur");
if (found !== null) {
console.log(found.toUpperCase());
} else {
console.log("Topilmadi");
}
Topilmadi
Qaytish tipini string | null deb yozish muhim: u funksiyani
chaqirgan har kimni natijani tekshirishga majburlaydi.
Toraytirish usullari
| Tekshiruv | Qachon ishlatiladi |
|---|---|
typeof x === "string" |
Asosiy tiplar uchun |
x === null |
Bo’sh qiymat uchun |
x.kind === "circle" |
Ajratuvchi maydonli union uchun |
"radius" in shape |
Maydon bor-yo’qligini tekshirish |
x instanceof Error |
Sinf nusxasi uchun |
Oxirgi qator try/catch bilan ishlashda kerak bo’ladi:
xatolar darsidagi catch blokidagi qiymat tipi
oldindan noma’lum, shuning uchun uni tekshirish zarur.
Amaliy mashq
type Identifier = string | numbere’lon qilib, ikkala tipdagi qiymat berib ko’ring;- Union qiymatida
toUpperCase()ni tekshiruvsiz chaqirib,TS2339xato xabarining ikkinchi qatorini o’qing; - Shu kodni
typeoftekshiruvi bilan tuzating; type Weekdaynomli literal union yarating va ro’yxatda yo’q kunni berib xato xabarini o’qing;- Ajratuvchi maydonli union yozing:
{ kind: "square"; side: number }variantini qo’shib,areafunksiyasini kengaytiring; string | nullqaytaradigan funksiya yozib, natijasini tekshirmasdan ishlatishga urinib ko’ring.
5-qadam eng muhimi: yangi variant qo’shganda TypeScript uni qayerda qayta ishlash kerakligini o’zi ko’rsatadi.
Qisqacha xulosa
- Union tip (
string | number) bir nechta tipdan birini qabul qiladi. - Union qiymatida faqat umumiy metodlarni tekshiruvsiz ishlatish mumkin.
- Toraytirish —
typeof,===,invainstanceoftekshiruvlari orqali tipni aniqlashtirish. - Literal tip aynan bitta qiymatdan iborat; union ichida ular ruxsat etilgan qiymatlar ro’yxatini beradi.
- Ajratuvchi maydonli union (
kind) TypeScript’ga qaysi variant ekanini aniq aytadi. string | nullqaytarish chaqiruvchini natijani tekshirishga majbur qiladi.
Keyingi darsda enum va as const — nomlangan doimiylar to’plamini yaratishning ikki yo’li.