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?

2voto

Lordbalmon Punkte 1552

Kurz gesagt, es ist unmöglich, aber ich hasse erzwungene Behauptungen mit as. Das ist meine Empfehlung.

enum Color {
  Rot,
  Grün
}

Erstellen Sie eine Map, optimieren Sie jedoch die Erstellung so, dass Sie dies nicht oft tun.

const reverse = new Map(Object.values(Color).map(item => [item.toString(), item]))

Werfen Sie jetzt diese Funktion weg und verwenden Sie einfach die reverseMap, um das Farben-Enum zu erhalten.

const colorText: string = "Rot"
const colorEnum: Color | undefined = reverse.get(colorText)

Beachten Sie das potenzielle undefined, da Sie einen Text in ein Enum konvertieren, müssen Sie dies explizit überprüfen. Diese Lösung ermöglicht es Ihnen auch, standardmäßig einen Wert bereitzustellen, indem Sie

const colorWithFallback: Color = reverse.get("Art von Gelb") || Color.Rot

2voto

Joshua Punkte 5878

Wenn Sie daran interessiert sind, eine Typenkennzeichnung für das zu haben, was sonst ein string wäre (so bin ich auf dieses Problem gestoßen), könnte das für Sie funktionieren:

enum CurrencyCode {
  cad = "cad",
  eur = "eur",
  gbp = "gbp",
  jpy = "jpy",
  usd = "usd",
}

const createEnumChecker = (
  enumVariable: { [key in T]: TEnumValue }
) => {
  const enumValues = Object.values(enumVariable);
  return (value: string | number | boolean): value is TEnumValue =>
    enumValues.includes(value);
};

const isCurrencyCode = createEnumChecker(CurrencyCode);

const input: string = 'gbp';

let verifiedCurrencyCode: CurrencyCode | null = null;
// verifiedCurrencyCode = input;
// ^ TypeError: Type 'string' is not assignable to type 'CurrencyCode | null'.

if (isCurrencyCode(input)) {
  verifiedCurrencyCode = input; // No Type Error 
}

Lösung ist aus diesem github issue über generische Enums entnommen

1voto

roydukkey Punkte 2930

Die meisten der gegebenen Antworten bieten keine umfassende Unterstützung für Enums. Zwar hat der OP darum gebeten, das Enum nur aus einem Zeichenfolgenwert zu erhalten, aber Enums erlauben auch andere Werte.

interface StandardEnum {
    [id: string]: T | string;
    [nu: number]: string;
}

/**
 * Konvertiert die gegebene Darstellung des Werts einer enumerierten Konstanten in einen äquivalenten enumerierten Typ.
 *
 * @param type - Ein Enumerations Typ
 * @param value - Ein Wert zum Konvertieren
 */
export const genericValueToEnum = > (
    type: StandardEnum,
    value: K[keyof K]
): T | undefined => {
    const keys = Object.keys(type); // ...aber nicht wirklich.
    const values = Object.values(type)
        // Filtern von Enumerationsmembernamen, weil `Object.values()` diese einschließt.
        .filter((value) => !(
            typeof value === 'string' &&
            keys.includes(value) &&
            type[value] !== value
        ));

    return values.includes(value)
        ? value as unknown as T
        : undefined;
}

Dies funktioniert für alle Enums, egal wie komplex (oder seltsam), solange sie nicht gekennzeichnet sind.

enum OddEnum {
    None = -1,
    No = 0,
    Yes = 1,
    Twenty = '20'
    Other = 'Other',
    MORE = 'More',
};

genericValueToEnum(OddEnum, -1); // => -1 als OddEnum;
genericValueToEnum(OddEnum, 'Other'); // => 'Other' als OddEnum;
genericValueToEnum(OddEnum, 'MORE'); // => undefined;

1voto

Andere Variation kann sein

const grün= "Grün";

const farbe : Farbe = Farbe[grün] as Farbe;

-2voto

andrei.b Punkte 43

Wenn Sie Namensräume verwenden, um die Funktionalität Ihres Enums zu erweitern, können Sie auch Folgendes tun

    enum Color {
        Red, Green
    }

    export namespace Color {
      export function getInstance(color: string) : Color {
        if(color == 'Red') {
          return Color.Red;
        } else if (color == 'Green') {
          return Color.Green;
        }
      }
    }

und verwenden Sie es so

  Color.getInstance('Red');

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