Warum den Wert in einem Enum TypeScript prüfen? Ein praktisches Beispiel
\n\nStellen Sie sich vor: Sie schreiben ein Backend in Node.js mit TypeScript. Der Client sendet einen Bestellstatus – den String "shipped". Sie haben ein Enum OrderStatus mit den Varianten: Pending, Processing, Shipped, Delivered. Doch plötzlich kommt "CANCELLED" oder "unknown". Was tun? Richtig – überprüfen, ob der Wert im Enum TypeScript existiert.
Diese Aufgabe ist eine der häufigsten auf Stack Overflow (tausende Aufrufe). Und das zu Recht: Ein Enum in TypeScript ist nicht nur eine Sammlung von Konstanten, sondern ein kniffliges Konstrukt mit numerischen und stringbasierten Varianten. In dieser Anleitung analysieren wir alle Methoden zur Überprüfung des Vorhandenseins eines Werts in einem Enum, von einfach bis fortgeschritten, mit Codebeispielen und Erklärungen.
\n\nWenn Sie gerade erst anfangen, TypeScript zu lernen, oder Ihr Wissen vertiefen möchten – dieser Artikel ist für Sie. Los geht's!
\n\nWas ist ein Enum in TypeScript? Eine kurze Einführung
\n\nEin Enum (Aufzählung) ist eine Möglichkeit, einen Satz benannter Konstanten zu definieren. In TypeScript gibt es zwei Arten von Enums:
\n\n- \n
- Numerische Enums – Werte werden automatisch inkrementiert (0, 1, 2...). \n
- String-Enums – Jedem Member wird explizit ein String zugewiesen. \n
Beispiel für ein numerisches Enum:
\n\nenum Direction {\n Up, // 0\n Down, // 1\n Left, // 2\n Right // 3\n}\n\nBeispiel für ein String-Enum:
\n\nenum Status {\n Active = "ACTIVE",\n Inactive = "INACTIVE",\n Pending = "PENDING"\n}\n\nWarum überhaupt den Wert prüfen? Weil Daten von außen (API, Formulare, Datenbanken) beliebig sein können. Ohne Prüfung riskieren Sie undefined oder einen Laufzeitfehler.
Methode 1. Der Klassiker: Object.values() + includes()
\n\nDie beliebteste und lesbarste Methode – das Enum in ein Werte-Array umwandeln und die Zugehörigkeit mit includes() prüfen.
Für String-Enums:
\n\nenum Color {\n Red = "RED",\n Green = "GREEN",\n Blue = "BLUE"\n}\n\nfunction isColor(value: string): boolean {\n return Object.values(Color).includes(value as Color);\n}\n\nconsole.log(isColor("RED")); // true\nconsole.log(isColor("YELLOW")); // false\n\nFür numerische Enums – ein Trick! Object.values() gibt ein reverses Mapping (Schlüssel und Werte) zurück. Daher müssen Sie nur Zahlen filtern:
enum NumberEnum {\n A = 1,\n B = 2,\n C = 3\n}\n\nfunction isNumberEnumValue(value: number): boolean {\n return Object.values(NumberEnum).filter(v => typeof v === 'number').includes(value);\n}\n\nconsole.log(isNumberEnumValue(2)); // true\nconsole.log(isNumberEnumValue(5)); // false\n\nDieser Ansatz ist universell, erfordert aber Vorsicht bei numerischen Enums. Vorteil: einfach und anschaulich. Nachteil: Sie müssen an die Filterung denken.
\n\nMethode 2. Type Guard: Prüfung über Enum-Schlüssel
\n\nWenn Sie nicht nur den Wert prüfen, sondern auch eine Typgarantie erhalten möchten, verwenden Sie einen Type Guard. Diese Methode ist besonders nützlich bei der Arbeit mit APIs, wenn Sie den Typ eingrenzen möchten.
\n\nenum UserRole {\n Admin = "admin",\n User = "user",\n Guest = "guest"\n}\n\nfunction isUserRole(value: string): value is UserRole {\n return Object.values(UserRole).includes(value as UserRole);\n}\n\nfunction processRole(role: string) {\n if (isUserRole(role)) {\n // TypeScript weiß, dass role ein UserRole ist\n console.log(`Rolle: ${role}`);\n } else {\n console.log("Unbekannte Rolle");\n }\n}\n\nprocessRole("admin"); // Rolle: admin\nprocessRole("moderator"); // Unbekannte Rolle\n\nDieser Ansatz bietet Typsicherheit und reduziert die Anzahl der Prüfungen im Code. Ich empfehle ihn für ernsthafte Projekte.
\n\n