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?

4voto

Willem van der Veen Punkte 26043

Enums, die auf die von Ihnen erstellte Weise erstellt wurden, werden in ein Objekt kompiliert, das sowohl vorwärts (Name -> Wert) als auch rückwärts (Wert -> Name) Abbildungen speichert. Wie wir auf diesem Chrome DevTools-Screenshot sehen können:

Gib hier die Bildbeschreibung ein

Hier ist ein Beispiel, wie die doppelte Zuordnung funktioniert und wie man von einer zur anderen umwandelt:

enum Farbe{
    Rot, Grün
}
// Zu einer Nummer
var grüneNr: number = Farbe['Grün'];
console.log(grüneNr); // gibt 1 aus

// Zu einem String
var grünerString: string = Farbe[Farbe['Grün']];  // oder Farbe[Farbe[1]
console.log(grünerString); // gibt Grün aus

// In Ihrem Beispiel

// erhalte Farbe.grün anstelle des Strings grün
var grün: string = Farbe[Farbe.Grün];  

// erhalte den Enum-Nummernwert, der der Farbe.grün-Eigenschaft entspricht
var farbe: Farbe = (Farbe)[grün];  

console.log(farbe); // gibt 1 aus

4voto

Jørgen Andersen Punkte 641

Die meisten dieser Antworten scheinen mir übermäßig komplex zu sein...

Sie könnten einfach eine Parse-Funktion im Enum erstellen, die einen der Schlüssel als Argumente erwartet. Wenn neue Farben hinzugefügt werden, sind keine weiteren Änderungen erforderlich.

enum Color { red, green}

// Holen Sie die Schlüssel 'red' | 'green' (aber nicht 'parse')
type ColorKey = keyof Omit;

namespace Color {
  export function parse(colorName: ColorKey ) {
    return Color[colorName];
  }
}

// Der Schlüssel 'red' existiert als Enum, daher wird keine Warnung angezeigt
Color.parse('red');  // == Colors.red

// Ohne den 'any'-Cast würde eine Kompilierungszeitwarnung ausgegeben
// Weil 'foo' nicht einer der Schlüssel im Enum ist
Color.parse('foo' as any); // == undefined

// Erzeugt eine Warnung:
// "Das Argument vom Typ '"bar"' ist nicht zuweisbar zum Parameter vom Typ '"red" | "green"'"
Color.parse('bar');

4voto

Bohdan Ivanchenko Punkte 125

Es funktioniert für mich in TypeScript 4.4.3 TS Playground link.

  const stringToEnumValue = , K extends keyof T>(
    enumObj: T,
    value: string,
  ): T[keyof T] | undefined =>
    enumObj[
      Object.keys(enumObj).filter(
        (k) => enumObj[k as K].toString() === value,
      )[0] as keyof typeof enumObj
    ];

  enum Color {
    Red = 'red',
    Green = 'green',
  }

  const result1 = stringToEnumValue(Color, 'yellow'); // undefined
  const result2 = stringToEnumValue(Color, 'green'); // Color.Green

  console.log(result1) // undefined = undefined
  console.log(result2) // Color.Green = "green"

3voto

Oyeme Punkte 10820

Versuchen Sie dies

var farbe: Farbe = (Farbe wie jeder)["Grün];

Dies funktioniert gut für Version 3.5.3

3voto

funder7 Punkte 1086

Typescript 3.9 Vorschlag

enum Farbe { ROT, GRÜN }

const farbe = 'ROT' as Farbe;

easy peasy... lemon squeezy!

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