literalenumtipePemula4 mnt baca

Literal Type dan Enum

Mengunci nilai yang boleh dipakai: string literal, union literal, dan enum.

Literal Type: Nilai Spesifik sebagai Tipe

Tipe tidak harus kategori luas seperti string. Bisa satu nilai persis:

typescript
let arah: "utara" | "selatan" | "timur" | "barat";
arah = "utara";   // ok
arah = "tenggara"; // Error: Type '"tenggara"' is not assignable

Typo seperti "utaraa" yang di JavaScript jadi bug silent, di sini langsung ditolak. Union literal seperti ini adalah cara paling ringan membatasi pilihan nilai.

Enum: Kumpulan Konstanta Bernama

typescript
enum Peran {
  Admin = "ADMIN",
  Kasir = "KASIR",
  Dapur = "DAPUR",
}

function bukaFitur(peran: Peran) {
  if (peran === Peran.Admin) {
    // ...
  }
}

bukaFitur(Peran.Kasir); // ok
bukaFitur("KASIR");     // Error: string bukan Peran

Enum mengelompokkan konstanta terkait di satu tempat dengan nama yang jelas, plus dapat dipakai sebagai tipe sekaligus value.

Enum Numerik vs String

Enum tanpa nilai jadi angka berurutan (0, 1, 2...). Enum string seperti di atas lebih aman karena nilainya terbaca saat debugging dan saat dikirim ke API. Enum numerik rawan tertukar kalau urutannya berubah.

Kapan Pakai yang Mana

  • Pilihan nilai sederhana dan lokal: union literal ("kecil" | "besar"). Ringan, tanpa kode runtime tambahan.
  • Konstanta yang dipakai lintas file dan butuh namespace: enum.
  • Nilai dari API yang harus cocok persis: union literal dari string, karena enum tidak otomatis cocok dengan string mentah dari JSON.

Catatan teknis: Enum biasa menghasilkan kode JavaScript saat kompilasi (object lookup). const enum di-inline sehingga tanpa overhead runtime, tapi tidak bisa dipakai lintas file dengan isolatedModules (setting umum di Vite/Next.js). Kalau ragu, union literal + object konstan biasa adalah pilihan paling aman.