enum în TypeScript

Un set de constante cu nume, numerice sau text, care există și la rulare ca obiect.

Sintaxă
enum Nume { A, B, C }              // numeric: 0, 1, 2
enum Nume { A = "a", B = "b" }    // string

Ce face enum

Un enum grupează câteva constante înrudite sub un nume: zilele săptămânii, stările unei comenzi, nivelurile de acces. Spre deosebire de majoritatea construcțiilor TypeScript, un enum generează cod JavaScript: un obiect cu valorile lui, care există la rulare.

În enum-urile numerice, valorile pornesc de la 0 și cresc cu 1, dacă nu dai tu alte valori. Ele au și „mapare inversă”: Zi[0] dă numele "Luni". În enum-urile string, fiecare membru are o valoare text scrisă explicit și nu există mapare inversă; sunt mai ușor de citit în loguri și în JSON.

Multe proiecte preferă un union de literale ("nouă" | "livrată") sau un obiect cu as const, care nu generează cod special. Opțiunea erasableSyntaxOnly (și rularea directă a fișierelor .ts în Node.js) nu acceptă enum. Pentru valori înlocuite la compilare vezi const enum.

Exemple

Exemplul 1: Enum numeric și maparea inversă

enum Zi {
    Luni,
    Marti,
    Miercuri,
    Joi,
    Vineri,
}

const azi: Zi = Zi.Miercuri;
console.log(azi, Zi[azi]);
console.log(Zi.Vineri - Zi.Luni, "zile între luni și vineri");
console.log(Zi);

Rezultat

2 Miercuri
4 zile între luni și vineri
{
  '0': 'Luni',
  '1': 'Marti',
  '2': 'Miercuri',
  '3': 'Joi',
  '4': 'Vineri',
  Luni: 0,
  Marti: 1,
  Miercuri: 2,
  Joi: 3,
  Vineri: 4
}

Exemplul 2: Enum string pentru stări

enum Stare {
    Noua = "NOUĂ",
    Trimisa = "TRIMISĂ",
    Livrata = "LIVRATĂ",
}

function urmatoarea(s: Stare): Stare {
    switch (s) {
        case Stare.Noua: return Stare.Trimisa;
        case Stare.Trimisa: return Stare.Livrata;
        case Stare.Livrata: return Stare.Livrata;
    }
}

let s = Stare.Noua;
for (let i = 0; i < 3; i++) {
    console.log(s);
    s = urmatoarea(s);
}
console.log(JSON.stringify({ comanda: 101, stare: Stare.Trimisa }));

Rezultat

NOUĂ
TRIMISĂ
LIVRATĂ
{"comanda":101,"stare":"TRIMISĂ"}

Exemplul 3: Un text nu este un membru de enum string

Chiar dacă valoarea textului este aceeași, un enum string acceptă doar membrii lui.

enum Stare {
    Noua = "NOUĂ",
    Livrata = "LIVRATĂ",
}
const s: Stare = "NOUĂ";
console.log(s);

Eroarea afișată de tsc

exemplu.mts(5,7): error TS2322: Type '"NOUĂ"' is not assignable to type 'Stare'.

Greșeli frecvente

  • Adaugi un membru nou la mijlocul unui enum numeric. Valorile de după se schimbă, iar datele salvate cu valorile vechi devin greșite. Dă valori explicite.
  • Iterezi cu Object.keys pe un enum numeric și primești și numele, și numerele (din cauza mapării inverse).

Comenzi înrudite

  • const enum: Un enum ale cărui valori sunt înlocuite direct în cod la compilare, fără obiect generat la rulare.
  • tipuri literale: Un tip care acceptă o singură valoare exactă, de exemplu „Iași” sau 3; combinate în union dau liste de valori permise.
  • as const: Face un literal complet readonly și păstrează valorile exacte ca tipuri: „Iași” în loc de string.
  • union (|): Un tip care acceptă valori din mai multe tipuri: A | B înseamnă fie A, fie B.