const enum în TypeScript

Un enum ale cărui valori sunt înlocuite direct în cod la compilare, fără obiect generat la rulare.

Sintaxă
const enum Nume { A = 1, B = 2 }

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ște undefined la rulare.
  • Încerci să afișezi toate valorile cu Object.values(Directie). Obiectul nu există; folosește un enum obișnuit sau un obiect as 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.