Typescript 1.x
Wenn Sie sicher sind, dass ein Eingabestring mit dem Color-Enum genau übereinstimmt, verwenden Sie:
const color: Color = (Color)["Red"];
Im Falle, dass ein Eingabestring nicht mit dem Enum übereinstimmen kann, verwenden Sie:
const mayBeColor: Color | undefined = (Color)["WrongInput"];
if (mayBeColor !== undefined){
// TypeScript wird hier verstehen, dass mayBeColor vom Typ Color ist
}
[Playground](http://www.typescriptlang.org/play/#src=enum%20Color%7B%0A%20%20%20%20Red%2C%20Green%0A%7D%0Aconst%20color%3A%20Color%20%3D%20%3Cany%3EColor%5B%22Green%22%5D%3B%0Aconsole.log(%22color%3A%20%22%20%2B%20color)%3B%0A%0Aconst%20mayBeColor%3A%20Color%20%7C%20undefined%20%3D%20%3Cany%3EColor%5B%22WrongInput%22%5D%3B%0Aconsole.log(%22nicht vorhandene Farbe%3A%20%22%20%2B%20mayBeColor)%3B%0A%0Aconst%20mayBeColor2%3A%20Color%20%7C%20undefined%20%3D%20%3Cany%3EColor%5B%22Green%22%5D%3B%0Aconsole.log(%22vorhandene Farbe%3A%20%22%2BmayBeColor2)%3B)
Wenn wir enum
nicht auf den Typ casten, zeigt TypeScript den Fehler:
Element hat implizit den Typ 'any', weil der Indexausdruck nicht vom Typ 'number' ist.
Das bedeutet, dass der TypeScript Enum-Typ standardmäßig mit Nummernindizes funktioniert, z.B. let c = Color[0]
, aber nicht mit Zeichenfolgenindizes wie let c = Color["string"]
. Dies ist eine bekannte Einschränkung des Microsoft-Teams für das allgemeinere Problem Objektzeichenindizes.
Typescript 2.x-4x
TypeScript hat zum Konzept keyof typeof
gewechselt.
Wenn jemand Zeichenwert-Enums verwendet:
enum Color {
Green = "GRN",
Red = "RD"
}
gibt es eine Sprachlösung, um Schlüssel zu Werten abzubilden (Color.Green -> "GRN") nur durch den Zugriff auf ein Enum-Mitglied, aber es gibt keinen einfachen Weg, das Gegenteil zu tun ("GRN" -> Color.Green). Aus Reverse-Mapping:
Beachten Sie, dass String-Enum-Mitglieder überhaupt keine rückwärts Mapping generiert bekommen.
Eine mögliche Lösung besteht darin, Werte manuell zu überprüfen und den Wert in das Enum zu casten. Bitte beachten Sie, dass dies nur mit String-Enums funktioniert.
function enumFromStringValue (enm: { [s: string]: T}, value: string): T | undefined {
return (Object.values(enm) as unknown as string[]).includes(value)
? value as unknown as T
: undefined;
}
enumFromStringValue(Color, "RD"); // Color.Red
enumFromStringValue(Color, "UNKNOWN"); // undefined
enumFromStringValue(Color, "Red"); // undefined