715 Stimmen

Wie konvertiere ich einen String in ein Enum in TypeScript?

Ich habe das folgende Enum in TypeScript definiert:

enum Color{
    Rot, Grün
}

Jetzt erhalte ich in meiner Funktion die Farbe als Zeichenkette. Ich habe den folgenden Code versucht:

var grün = "Grün";
var farbe : Color = grün; // Fehler: kann Zeichenkette nicht in Enum konvertieren

Wie kann ich diesen Wert in ein Enum konvertieren?

751voto

basarat Punkte 230827

Enums in TypeScript 0.9 sind zeichen- und zahlenbasiert. Sie sollten keine Typkonvertierung für einfache Konvertierungen benötigen:

enum Color{
    Red, Green
}

// Zu Zeichenfolge
var green: string = Color[Color.Green];

// Zu Enum / Zahl
var color : Color = Color[green];

Online ausprobieren

Ich habe Dokumentationen über dieses und andere Enum-Muster in meinem OSS-Buch : https://basarat.gitbook.io/typescript/type-system/enums

Bearbeitung- Stellen Sie sicher, dass Sie dies verwenden, wenn --noImplicitAny aktiviert ist

var color : Color = Color[green as keyof typeof Color];

276voto

Victor Punkte 3321

Ab Typescript 2.1 sind Zeichenfolgenschlüssel in Enumerations stark typisiert. keyof typeof wird verwendet, um Informationen über verfügbare Zeichenfolgenschlüssel zu erhalten (1):

enum Color{
    Rot, Grün
}

let typisierteFarbe: Color = Color.Grün;
let typisierteFarbeString: keyof typeof Color = "Grün";

// Fehler "Schwarz ist nicht zuweisbar ..." (Indexierung mit Color["Schwarz"] gibt zur Laufzeit undefined zurück)
typisierteFarbeString = "Schwarz";

// Fehler "Der Typ 'string' ist nicht zuweisbar ..." (Indexierung funktioniert zur Laufzeit)
let letFarbeString = "Rot";
typisierteFarbeString = letFarbeString;

// Funktioniert einwandfrei
typisierteFarbeString = "Rot";

// Funktioniert einwandfrei
const constFarbeString = "Rot";
typisierteFarbeString = constFarbeString

// Funktioniert einwandfrei (danke @SergeyT)
let letFarbeString = "Rot";
typisierteFarbeString = letFarbeString as keyof typeof Color;

typisierteFarbe = Color[typisierteFarbeString];

https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types

204voto

alexania Punkte 2245

Wenn Sie Zeichenfolgenwerte für Ihr Enum bereitstellen, funktioniert ein direktes Casting problemlos.

enum Color {
  Green = "Green",
  Red = "Red"
}

const color = "Green";
const colorEnum = color as Color;

162voto

Jonas Punkte 2721
enum Farbe{
    Rot, Grün
}

// Zu String
var grün: string = Farbe[Farbe.Grün];

// Zu Enum / Zahl
var farbe : Farbe = Farbe[grün as keyof typeof Farbe]; //Funktioniert mit --noImplicitAny

Dieses Beispiel funktioniert mit --noImplicitAny in TypeScript

Quellen:
https://github.com/Microsoft/TypeScript/issues/13775#issuecomment-276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types

99voto

Nick N. Punkte 11730

Angenommen, Sie verwenden TypeScript: Viele der Lösungen oben funktionieren möglicherweise nicht oder sind übermäßig komplex.

Situation: Die Zeichenfolgen stimmen nicht mit den Enumerationswerten überein (Groß-/Kleinschreibung unterscheidet sich)

enum Farbe {
  Grün = "grün",
  Rot = "rot"
}

Verwenden Sie einfach:

const farbe = "grün" as Farbe

Bitte beachten Sie, dass dies keine gültige Aufzählung garantiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X