ProgrammierungFullstack-Entwickler

Wie funktioniert die Enum-Typisierung in TypeScript, welche Arten von Enums gibt es, und was ist der Unterschied zwischen konstanten und berechneten Werten? Welche Fallstricke können bei der Verwendung von Enums auftreten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

In TypeScript gibt es zwei Arten von enum:

  • Numerisch (numeric) — Standardmäßig werden die Werte der Reihe nach ab 0 zugewiesen.
  • String (string) — Jedes Wert muss explizit angegeben werden und ist eine Zeichenkette.

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:

  • Numerische Enums unterstützen die Rückwärtsabbildung enum → Zahl → String-Name.
  • String-Enums — nur direkte (Name → Wert).
  • Kompilierungsfehler bei der Mischung von Typen in einem Enum.

Fangfrage

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.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


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.