TypeScript-Enums und ihre Alternativen

TypeScript-Enums

TypeScript-Enum: numerisch, String, const und die Alternativen | We.Inc

Erzeuge numerische, String- und const-Enums aus deinen eigenen Member-Namen, sieh das genaue JavaScript, das jedes ausgibt, und vergleiche sie mit as-const-Objekten und Literal-Unions.

Ein Enum gibt einer Menge benannter Konstanten einen gemeinsamen Typ. Numerische Enums zählen ab 0 hoch und bilden Zahlen auch zurück auf Namen ab. String-Enums brauchen ein Literal pro Member und haben kein Reverse Mapping. const-Enums werden inline eingesetzt und verschwinden. Anders als das meiste in TypeScript erzeugen normale Enums echtes JavaScript, deshalb bevorzugen viele Teams as-const-Objekte.

Fünf Wege, eine feste Menge von Werten abzubilden

Gib Member-Namen in den Generator ein und wechsle zwischen den Stilen. Er schreibt die TypeScript-Deklaration und das JavaScript, das der Compiler ausgeben würde, damit du die Kosten jeder Wahl siehst, bevor sie in deinem Bundle landet.

Häufige Fragen

Was ist ein Reverse Mapping?

Bei numerischen Enums speichert tsc beide Richtungen im Objekt, Direction.Up ist also 0 und Direction[0] der String Up. String-Member bekommen keinen umgekehrten Eintrag, weil der Wert mit dem Namen eines anderen Members kollidieren könnte.

Warum kann ich keinen einfachen String an eine Funktion übergeben, die ein String-Enum erwartet?

String-Enum-Member sind eigene Typen. Der Compiler meldet, dass das Literal dem Enum nicht zuweisbar ist, Aufrufer müssen also Status.Draft schreiben. Wenn Aufrufer das Literal übergeben sollen, nutze stattdessen eine Union aus String-Literalen.

Wie iteriere ich über Enum-Werte?

Bei einem String-Enum liefert Object.values(MyEnum) die Werte. Bei einem numerischen Enum enthält das Objekt auch die umgekehrten Schlüssel, filtere also: Object.values(MyEnum).filter((v) => typeof v === 'number').

Sind Enums veraltet?

Nein. Sie bleiben Teil von TypeScript. Die neuere Option erasableSyntaxOnly, eingeführt in TypeScript 5.8, erlaubt Projekten, die auf Type Stripping setzen, sie einfach zu verbieten, weil sich ein Enum nicht durch Löschen von Annotationen entfernen lässt.

Führt Node.js Dateien mit Enums direkt aus?

Nicht mit dem standardmäßigen Type Stripping. Die Node-Dokumentation zählt Enum-Deklarationen zu den Funktionen, die Codegenerierung brauchen und in diesem Modus nicht unterstützt werden. Kompiliere sie also mit tsc oder einem anderen Transformer oder wechsle zu einem as-const-Objekt.

Numerische Enums: kompakt, aber fragil

String-Enums: lesbar und streng

Das as-const-Muster

Die drei Enum-Arten und was sie erzeugen

Numerisches Enum mit Startwert

Mid und High zählen von Low aus weiter. Das erzeugte Objekt bildet in beide Richtungen ab.

String-Enum

Jeder Member wird einmal zugewiesen, ohne umgekehrten Eintrag.

const enum

Die Deklaration verschwindet, und jede Verwendung wird zu ihrem Wert.

Entfernbare Alternativen

as-const-Objekt plus abgeleitete Union

Funktioniert mit Type Strippern, lässt sich mit Object.values durchlaufen und akzeptiert den rohen String.

Einfache Union, wenn keine Liste zur Laufzeit nötig ist

Wird vollständig entfernt, der Compiler lehnt trotzdem jeden anderen String ab.

Enums in einem Projekt mit Type Stripping verbieten

Mit dieser Option ist eine Enum-Deklaration ein Kompilierfehler.

Numerisches Enum

String-Enum

const enum

as-const-Objekt

Union-Typ

Enum-Generator

Typname

Member (durch Kommas getrennt)

Erste Zahl

Enum-Stil

TypeScript

Erzeugtes JavaScript

TypeScript kopieren

JavaScript kopieren

Nutze Namen, die mit einem Buchstaben, $ oder _ beginnen und nur Buchstaben, Ziffern, $ oder _ enthalten, ohne einen Namen doppelt zu verwenden.

{n} Member

Kostenlos starten · Keine Kreditkarte nötig

Verwandt: Ratgeber

Produkt

Für wen

Funktionen

Ressourcen

Unternehmen

Sitemap