Enum — numeric, string enum, const enum, qachon ishlatiladi
Oldingi darsda literal union bilan holatlarni belgiladik: "faol" | "nofaol" | "bloklangan". Bu ko'p hollarda yetarli. Lekin ba'zan nomli konstantalar to'plamiga ehtiyoj bo'ladi — har birini yakka o'zi ma'noli nom bilan, guruh sifatida. Bu holat uchun — Enum.
Enum nima?
Enum — nomli konstantalar to'plami. Bir guruh tegishli qiymatlar bir nom ostida yig'iladi.
enum Yo_nalish {
Shimol,
Janub,
Sharq,
Garb,
}
Ishlatish:
function yur(yo_nalish: Yo_nalish): void {
console.log(yo_nalish);
}
yur(Yo_nalish.Shimol); // ✅
yur("shimol"); // ❌ — string emas, Yo'nalish kerak
Numeric enum
Standart enum — numeric: har bir element 0 dan boshlab son oladi:
enum Yo_nalish {
Shimol, // 0
Janub, // 1
Sharq, // 2
Garb, // 3
}
console.log(Yo_nalish.Shimol); // 0
console.log(Yo_nalish.Janub); // 1
Boshlanish sonini o'zgartirish:
enum HttpKod {
OK = 200,
Yaratildi = 201,
XatoSorov = 400,
Topilmadi = 404,
ServerXato = 500,
}
console.log(HttpKod.OK); // 200
console.log(HttpKod.Topilmadi); // 404
String enum
Numeric enum da son qiymatlari ma'nosiz bo'lishi mumkin. String enum da har element aniq matn qiymati oladi:
enum Holat {
Faol = "faol",
Nofaol = "nofaol",
Kutilmoqda = "kutilmoqda",
Bloklangan = "bloklangan",
}
console.log(Holat.Faol); // "faol"
console.log(Holat.Nofaol); // "nofaol"
String enum amalda ko'proq ishlatiladi — debug qilganda 0 emas, "faol" ko'rinadi. Tushunish oson.
Hayotiy o'xshatma
Semaforda uchta holat bor: qizil, sariq, yashil. Ular 0, 1, 2 emas — ular qizil, sariq, yashil. Har birining o'z ma'nosi, nomi bor. Enum — o'sha semaforn holatlari: nomli, guruhli, o'zaro bog'liq.
const enum — runtime da yo'q bo'ladigan enum
Oddiy enum JavaScript da ob'ektga aylanadi — runtime da mavjud. const enum esa kompilyatsiyada qiymatlar inline qo'yiladi, runtime da ob'ekt hosil bo'lmaydi:
const enum Yo_nalish {
Shimol = "shimol",
Janub = "janub",
}
const holat = Yo_nalish.Shimol;
Kompilyatsiyadan keyin:
const holat = "shimol"; // Yo_nalish ob'ekti yo'q — to'g'ridan qiymat
Bu bundle hajmini kamaytiradi. Lekin cheklov bor: const enum ni boshqa fayllarda ishlatishda ba'zi muammolar chiqishi mumkin (isolated modules rejimida).
Enum vs literal union — qachon qaysi?
Ikkalasi ham o'xshash vazifa bajaradi. Farq:
// Literal union
type Holat = "faol" | "nofaol" | "bloklangan";
// Enum
enum Holat {
Faol = "faol",
Nofaol = "nofaol",
Bloklangan = "bloklangan",
}
| Literal union | Enum | |
|---|---|---|
| Sintaksis | sodda | ko'proq yozuv |
| Runtime | yo'q | ob'ekt hosil bo'ladi |
| Guruh nomi | yo'q | Holat.Faol |
| Kengaytirish | & bilan |
qiyin |
| Amalda qabullangan | ko'proq | kamroq |
Zamonaviy TypeScript da: literal union ko'proq afzal ko'riladi. Enum faqat muayyan holatlarda: katta loyihalarda nomli guruh muhim bo'lsa, yoki boshqa tillar bilan interop bo'lsa.
Tez-tez uchraydigan xatolar
Numeric enum ni taqqoslash:
enum Rolat { Admin = 1, Foydalanuvchi = 2 }
console.log(Rolat.Admin === 1); // true — lekin bu xavfli
console.log(Rolat.Admin === Rolat.Admin); // ✅ — to'g'ri taqqoslash
Enum qiymatlarini to'g'ridan son bilan taqqoslash — niyatsiz mos kelishi mumkin. Doim Rolat.Admin bilan taqqoslansin.
String enum ni to'g'ridan string bilan berish:
enum Holat { Faol = "faol" }
function oʻzgartir(h: Holat): void { ... }
oʻzgartir("faol"); // ❌ — string emas, Holat.Faol kerak
oʻzgartir(Holat.Faol); // ✅
Bu ko'rinishda qattiq cheklov — enum va string o'zaro almashtirib bo'lmaydi.
Numeric enum ni teskari o'qish:
enum Yo_nalish { Shimol = 0, Janub = 1 }
console.log(Yo_nalish[0]); // "Shimol" — numeric enum da teskari o'qish mumkin
console.log(Yo_nalish[1]); // "Janub"
Bu ba'zan ajablantiradigan xususiyat. String enum da teskari o'qish ishlamaydi.
Xulosa
Numeric enum — sonli qiymatlar, 0 dan boshlanadi. Sonlarni o'zi belgilash mumkin (= 200).
String enum — har elementga aniq matn. Debug qilish oson. Amalda ko'proq ishlatiladi.
const enum — kompilyatsiyada inline qo'yiladi. Runtime da ob'ekt yo'q, bundle kichik.
Zamonaviy loyihalarda literal union ("faol" | "nofaol") ko'proq afzal ko'riladi. Enum — nomli guruh muhim bo'lsa yoki katta jamoa bilan ishlash.
Keyingi dars
16-dars: Interface — asoslar, sintaksis, ob'ekt shakli