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 enumdintr-o bibliotecă. Cei care compilează cuisolatedModulessau cu alte unelte nu îl pot folosi; unenumobișnuit sau un obiectas consteste 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.