Geschichte der Frage:
Enums sind ein Typ, der aus C/C++ und anderen Sprachen stammt, um endliche Mengen von benannten Konstanten zu beschreiben. In JavaScript gab es sie nicht, aber TypeScript implementiert Unterstützung dafür. Um die Leistung zu verbessern, wurde const enum erfunden — eine Erweiterung, bei der die Werte direkt zur Compile-Zeit anstelle von vollständigen Objekten eingesetzt werden.
Problem:
Normale enums erzeugen im JS erheblichen Hilfscode (Objekte, die eine bidirektionale Zuordnung von Name<->Wert gewährleisten). Dies ist nicht immer erforderlich, insbesondere wenn maximale Leistung und minimale Bundle-Größe wichtig sind.
Lösung:
Verwenden Sie const enum, wenn es notwendig ist, Werte bei der Kompilierung inline zu setzen und überflüssigen Code zu vermeiden. const enums haben jedoch Einschränkungen — sie funktionieren nur innerhalb eines TypeScript-Projekts, sind schwer bei der Transpilierung in verschiedene Module zu verwenden, und es können Probleme mit Tree Shaking sowie Import/Export auftreten.
Beispielcode:
const enum Direction { Up, Down, Left, Right } const move = Direction.Left; // Wird in JS einfach zu 2
Wichtige Merkmale:
Kann man const enums in d.ts-Dateien und öffentlichen Bibliotheken verwenden?
Nein. Es wird empfohlen, const enums in Bibliotheken zu vermeiden, da sie nur bei der Kompilierung inlined werden, was oft zu Fehlern bei einem erneuten Build und der Typbeschreibung führt.
Was passiert bei der Verwendung von const enum mit dem Parameter isolatedModules oder bei der Kompilierung mit Babel?
Es tritt ein Fehler auf: Babel und isolatedModules unterstützen nicht das Inlining von const enum, da sie keine sichere Ersetzung von Werten zur Compile-Zeit einer Datei gewährleisten können.
Kann man in const enums berechnete Werte und Zeichenfolgenwerte verwenden?
Komplexe Berechnungen (z. B. Ausdrücke durch Funktionen oder Variablen) sind verboten. Nur einfache Zahlen und Strings sind erlaubt.
Const enum wurde in einer Bibliothek veröffentlicht, in der .d.ts beschrieben und der Verbraucher erhielt einen Fehler aufgrund des Fehlens der Importzeile im endgültigen Bundle.
Vorteile:
Nachteile:
Const enum wurde nur innerhalb privater Teile des Projekts verwendet, ohne nach außen zu exportieren:
const enum Color { Red, Green, Blue } let arr = [Color.Red, Color.Green];
Vorteile:
Nachteile: