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.keyspe 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.