Enum — numeric, string enum, const enum, qachon ishlatiladi

~20 daq · TypeScript · Asosiy Turlar

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