In TypeScript gibt es zwei Arten von enum:
Es gibt auch heterogene Enums (gemischte Typen), deren Verwendung jedoch dringend abgeraten wird.
Beispiel:
enum Status { Init, Loading, Ready = 5, Error } // Status.Error === 6 enum HttpCode { Ok = 200, NotFound = 404, Internal = 'INTERNAL_ERROR' // Fehler! Nur Strings oder nur Zahlen } enum Direction { Up = 'UP', Down = 'DOWN', }
Konstante Werte werden zur Compile-Zeit berechnet. Wenn der ENUM-Wert von anderen Berechnungen oder Ausdrücken abhängt (z. B. einer Funktion), wird dies zu einem berechneten Wert (computed member). Nur frühere Mitglieder des enums können verwendet werden, um das aktuelle Mitglied als Standardwert zu berechnen.
Wichtige Merkmale:
Kann ein Wert eines anderen Enums beim Deklarieren eines Mitglieds eines neuen Enums verwendet werden?
Antwort: Ja, aber nur, wenn dieser Wert eine Konstante oder ein zuvor deklariertes Mitglied ist.
Beispiel:
enum A { X = 1 } enum B { Y = A.X } // OK
Es können jedoch keine Berechnungen auf Basis von Funktionen oder Daten aus anderen Quellen (z. B. Funktionsaufrufen) verwendet werden.
Geschichte
In einem Projekt zur Serialisierung von Daten für eine externe API wurde ein numerisches Enum verwendet. Bei der Änderung der Reihenfolge der Enum-Mitglieder „schwammen“ die Werte, und externe Systeme begannen, andere Zahlen zu erhalten. Dies führte zu falschen Zuständen bei externen Clients, die ohne Code-Audit nicht nachverfolgt werden konnten.
Geschichte
In einem React-Projekt wurden versehentlich String- und numerische Enums in switch-case verwendet, in der Erwartung, dass die Werte in Strings umgewandelt werden können. Aufgrund der Inkonsistenz funktionierte das switch nicht korrekt, und die Komponente gab ein ungültiges UI zurück.
Geschichte
Bei dem Versuch, ein Enum zu erstellen, bei dem ein Teil der Werte über eine Funktion berechnet wird, gab TypeScript keine Warnung aus, aber in mehreren Builds waren die Werte undefined. Das führte zu Problemen mit dem Routing, als das Enum als Identifikator für Pfade verwendet wurde. Der kritische Fehler trat nur im Produktions-Bundle auf.