Ce face const enum
Un const enum se scrie ca un enum obișnuit, dar cu const în față. La compilare, fiecare folosire, de exemplu Directie.Sus, este înlocuită cu valoarea ei (1 /* Directie.Sus */), iar obiectul enum nu mai este generat. Codul rezultat este mai mic și puțin mai rapid.
Pentru că obiectul nu există la rulare, nu poți folosi maparea inversă (Directie[1]) și nu poți itera membrii. Accesul se face doar cu un nume de membru scris direct.
Problema mare: un const enum exportat dintr-un alt fișier nu funcționează cu uneltele care compilează fiecare fișier separat (Babel, esbuild, opțiunea isolatedModules), pentru că acestea nu văd valorile. Documentația TypeScript recomandă evitarea lui în bibliotecile publicate; în aplicații, un obiect as const este o alternativă sigură.
Exemple
Exemplul 1: Valori înlocuite la compilare
În JavaScript-ul generat, Directie.Sus devine 1. Programul se comportă la fel ca un enum obișnuit.
const enum Directie {
Sus = 1,
Jos = 2,
Stanga = 3,
Dreapta = 4,
}
function muta(d: Directie): string {
return d === Directie.Sus || d === Directie.Jos ? "vertical" : "orizontal";
}
console.log(Directie.Stanga, muta(Directie.Sus), muta(Directie.Dreapta));
Rezultat
3 vertical orizontal
Exemplul 2: Ce generează tsc
Fișierul .mjs produs pentru exemplul de mai sus: obiectul Directie lipsește, iar valorile sunt scrise direct. export {} marchează fișierul ca modul ES.
npx tsc exemplu.mts --target es2024 --module nodenext
cat exemplu.mjs
Fișierul JavaScript generat
function muta(d) {
return d === 1 /* Directie.Sus */ || d === 2 /* Directie.Jos */ ? "vertical" : "orizontal";
}
console.log(3 /* Directie.Stanga */, muta(1 /* Directie.Sus */), muta(4 /* Directie.Dreapta */));
export {};
Exemplul 3: Maparea inversă nu este permisă
const enum Directie {
Sus = 1,
Jos = 2,
}
console.log(Directie[1]);
Eroarea afișată de tsc
exemplu.mts(5,22): error TS2476: A const enum member can only be accessed using a string literal.
Greșeli frecvente
- Exporți un
const enumîntr-o bibliotecă. Cine compilează cu Babel sau esbuild primeșteundefinedla rulare. - Încerci să afișezi toate valorile cu
Object.values(Directie). Obiectul nu există; folosește unenumobișnuit sau un obiectas const.
Comenzi înrudite
enum: Un set de constante cu nume, numerice sau text, care există și la rulare ca obiect.as const: Face un literal complet readonly și păstrează valorile exacte ca tipuri: „Iași” în loc de string.tipuri literale: Un tip care acceptă o singură valoare exactă, de exemplu „Iași” sau 3; combinate în union dau liste de valori permise.