preserveConstEnums în TypeScript

Păstrează în JavaScript obiectul unui const enum; folosirile lui sunt tot înlocuite cu valorile.

Sintaxă
"compilerOptions": { "preserveConstEnums": true }

Ce face preserveConstEnums

Un const enum dispare complet din JavaScript: fiecare folosire, de exemplu Livrare.Curier, este înlocuită direct cu valoarea "curier". Codul este mai mic, dar obiectul Livrare nu există la rulare (nu poți face Object.values(Livrare) din JavaScript).

Cu preserveConstEnums, obiectul este generat oricum, ca la un enum obișnuit, iar folosirile din TypeScript rămân înlocuite cu valori. Este utilă la depanare și pentru cod JavaScript care are nevoie de obiect. Implicit este false, dar devine true cu isolatedModules.

Parametri

Parametru Descriere
true Obiectul const enum apare în JavaScript.
false Valoarea implicită (fără isolatedModules).

Exemple

Exemplul 1: JavaScript-ul generat

Fără opțiune, din enum rămâne doar valoarea, cu numele în comentariu. Cu --preserveConstEnums, apare și obiectul Livrare (literele românești sunt scrise ca secvențe \u).

// tsconfig.json
{
  "compilerOptions": {
    "target": "es2022",
    "module": "nodenext"
  }
}

// index.ts
const enum Livrare {
  Curier = "curier",
  Posta = "poștă",
}

console.log(Livrare.Curier);

Rezultat (tsc 5.9)

$ npx tsc && cat index.js
console.log("curier" /* Livrare.Curier */);
export {};

$ npx tsc --preserveConstEnums && cat index.js
var Livrare;
(function (Livrare) {
    Livrare["Curier"] = "curier";
    Livrare["Posta"] = "po\u0219t\u0103";
})(Livrare || (Livrare = {}));
console.log("curier" /* Livrare.Curier */);
export {};

Exemplul 2: const enum folosit în cod

La rulare, Livrare.Posta este deja înlocuit cu textul "poștă".

const enum Livrare {
  Curier = "curier",
  Posta = "poștă",
}

function cost(l: Livrare): number {
  return l === Livrare.Curier ? 20 : 12;
}

console.log(Livrare.Posta, cost(Livrare.Posta), "lei");
console.log(Livrare.Curier, cost(Livrare.Curier), "lei");

Rezultat

poștă 12 lei
curier 20 lei

Greșeli frecvente

  • Să exporți un const enum dintr-o bibliotecă. Cei care compilează cu isolatedModules sau cu alte unelte nu îl pot folosi; un enum obișnuit sau un obiect as const este mai sigur.

Comenzi înrudite

  • isolatedModules: Dă eroare pentru codul care nu poate fi transformat corect fișier cu fișier (de esbuild, Babel, swc sau Node.js).
  • erasableSyntaxOnly: Interzice construcțiile TypeScript care generează cod (enum, namespace, parametri-proprietate), ca Node.js să poată rula direct fișierele .ts.
  • verbatimModuleSyntax: Importurile rămân exact cum sunt scrise; se șterg doar cele marcate cu type, deci tipurile trebuie importate cu import type.