Literal turlar — 'qizil' | 42 | true, as const
Foydalanuvchi holati (status) ni string tur bilan saqlashingiz mumkin. Lekin string juda keng — "faol", "nofaol", "bloklangan" dan tashqari istalgan matnni bersa bo'ladi. TypeScript ni "xatolig_kiritilgan_holat" deb yozilsa ham to'xtatmaydi.
Kerakli qiymat: faqat belgilangan to'rt holat. Boshqa hech narsa. Bu holat uchun — Literal tur.
Literal tur nima?
Tur sifatida aniq qiymat ko'rsatiladi — nafaqat qaysi tur (string, number), balki qaysi qiymat bo'lishi kerakligi:
type Holat = "faol" | "nofaol" | "kutilmoqda" | "bloklangan";
let status: Holat = "faol"; // ✅
let status: Holat = "o'chirilgan"; // ❌ — bu qiymat ruxsatda yo'q
Muharrir bu to'rtta qiymatni autocomplete qilib ko'rsatadi. Yozayotganda xato yo'l qolmaydi.
Hayotiy o'xshatma
Elektron shaklda "viloyat" tanlash. Dropdown ro'yxat bor: Toshkent, Samarqand, Buxoro, Andijon... Boshqa narsa yozib bo'lmaydi — faqat ro'yxatdagi variantlar. Literal tur — o'sha dropdown: qat'iy ro'yxat, tashqarisiga yo'l yo'q.
Son literal
Qiymat string bo'lishi shart emas — son ham bo'lishi mumkin:
type HttpKod = 200 | 201 | 400 | 401 | 403 | 404 | 500;
function javobQayta(kod: HttpKod): string {
if (kod === 200) return "OK";
if (kod === 404) return "Topilmadi";
return "Xato";
}
javobQayta(200); // ✅
javobQayta(999); // ❌ — 999 ruxsatda yo'q
Boolean literal
true va false ham literal tur:
type Faol = true;
const a: Faol = true; // ✅
const b: Faol = false; // ❌ — faqat true ruxsat
Amalda kamroq ishlatiladi — lekin conditional types da keng qo'llanadi.
as const — qiymatni qotirib qo'yish
Muammo
TypeScript o'zgaruvchiga qiymat berilganda turni kengaytiradi:
const yo_nalish = "shimol"; // TypeScript: string deb qabul qiladi
"shimol" deb yozilgan — lekin TypeScript string deb oladi. Bu degani, yo'nalish ni string qabul qiladigan joyga berib bo'ladi — agar faqat "shimol" | "janub" | "sharq" | "g'arb" bo'lishi kerak bo'lsa, bu muammo.
Yechim — as const
const yo_nalish = "shimol" as const;
// TypeScript: "shimol" literal tur (string emas)
Ob'ekt yoki massivda ham ishlaydi:
const RANGLAR = ["qizil", "yashil", "ko'k"] as const;
// TypeScript: readonly ["qizil", "yashil", "ko'k"]
// har bir element o'z literal turiga ega
as const ob'ektda
const SOZLAMALAR = {
til: "uz",
mavzu: "qorong'i",
til_kodi: 860,
} as const;
as const bilan:
- Barcha xususiyatlar
readonly— o'zgartirib bo'lmaydi - Turlar kengaytilmaydi:
tilturistringemas,"uz"literal tur
SOZLAMALAR.til = "en"; // ❌ — readonly, o'zgartirib bo'lmaydi
Konfiguratsiya sabab — as const
Ilova konfiguratsiyalari o'zgarmasligi kerak va aniq qiymatlar bo'lishi kerak:
const DB_SOZLAMA = {
host: "localhost",
port: 5432,
ssl: false,
} as const;
// DB_SOZLAMA.port turi: 5432 (number emas)
// DB_SOZLAMA.ssl turi: false (boolean emas)
Bu konfiguratsiyadan tur ajratib olish mumkin:
type DBPort = typeof DB_SOZLAMA.port; // 5432
Literal tur funksiya parametrida
type Yo_nalish = "shimol" | "janub" | "sharq" | "g'arb";
function yur(yo_nalish: Yo_nalish, qadam: number): void {
console.log(`${yo_nalish} tomonga ${qadam} qadam`);
}
yur("shimol", 5); // ✅
yur("tepaga", 5); // ❌ — "tepaga" Yo'nalish da yo'q
Tez-tez uchraydigan xatolar
as const siz literal tur kutilgan joyda string berish:
type Yo_nalish = "shimol" | "janub";
const belgi = "shimol"; // TypeScript: string (literal emas!)
function yur(yo_nalish: Yo_nalish) { ... }
yur(belgi);
// ❌ — string turi Yo'nalish ga mos kelmaydi
// Yechim:
const belgi = "shimol" as const; // "shimol" literal tur
yur(belgi); // ✅
Literal va union ni chalkashtirib yuborish:
type A = "a"; // faqat "a"
type B = "a" | "b"; // "a" yoki "b"
type C = string; // istalgan matn
A dan C tomonga — kengayadi (union katta, literal kichik). C dan A tomonga — torayadi (TypeScript ruxsat bermaydi).
Xulosa
Literal tur — aniq qiymatni tur sifatida berish. "faol" | "nofaol" — faqat shu ikki qiymat.
as const — qiymatni qotirib qo'yadi: string dan literal turga, readonly ga aylantiradi.
Amalda ko'p ishlatilishi: holat (status), yo'nalish, konfiguratsiya qiymatlari.
Keyingi dars
15-dars: Enum — numeric, string enum, const enum, qachon ishlatiladi