670 Stimmen

Wie bekomme ich die Namen der enum Einträge?

Ich möchte ein TypeScript-Enum-Objekt durchlaufen und den Namen jedes aufgezählten Symbols erhalten, zum Beispiel: enum myEnum { entry1, entry2 }

for (var entry in myEnum) { 
    // Verwende den Namen des Eintrags hier, z.B. "entry1"
}

808voto

shakram02 Punkte 8742

Obwohl die Antwort bereits gegeben ist, hat fast niemand auf die Dokumentation hingewiesen

Hier ist ein Auszug

enum SampleEnum {
    A,

}
let nameOfA = SampleEnum[SampleEnum.A]; // "A"

Beachten Sie, dass string enum members überhaupt keine umgekehrte Zuordnung erhalten.

372voto

Judah Gabriel Himango Punkte 57209

Der von Ihnen gepostete Code funktioniert; er gibt alle Mitglieder des Enums aus, einschließlich der Werte der Enum-Mitglieder. Zum Beispiel der folgende Code:

enum myEnum { bar, foo }

for (var enumMember in myEnum) {
   console.log("Enum-Mitglied: ", enumMember);
}

Wird Folgendes ausgeben:

Enum-Mitglied: 0
Enum-Mitglied: 1
Enum-Mitglied: bar
Enum-Mitglied: foo

Wenn Sie stattdessen nur die Mitgliedsnamen und nicht die Werte möchten, könnten Sie etwas wie folgt tun:

for (var enumMember in myEnum) {
   var isValueProperty = Number(enumMember) >= 0
   if (isValueProperty) {
      console.log("Enum-Mitglied: ", myEnum[enumMember]);
   }
}

Das wird nur die Namen ausgeben:

Enum-Mitglied: bar  
Enum-Mitglied: foo

Hinweis: Dies basiert leicht auf einem Implementierungsdetail: TypeScript kompiliert Enums zu einem JS-Objekt, wobei die Enum-Werte Mitglieder des Objekts sind. Wenn TS in Zukunft beschließt, sie anders zu implementieren, könnte die obige Technik kaputtgehen.

131voto

Michael Erickson Punkte 3711

Für mich ist ein einfacherer, praktischer und direkter Weg, um zu verstehen, was vor sich geht, ist die folgende Auflistung:

enum colors { red, green, blue };

Wird im Wesentlichen zu diesem konvertiert:

var colors = { red: 0, green: 1, blue: 2,
               [0]: "red", [1]: "green", [2]: "blue" }

Aufgrund dessen wird Folgendes wahr sein:

colors.red === 0
colors[colors.red] === "red"
colors["red"] === 0

Dies schafft eine einfache Möglichkeit, den Namen einer Aufzählung zu erhalten, wie folgt:

var color: colors = colors.red;
console.log("Die ausgewählte Farbe ist " + colors[color]);

Es schafft auch einen schönen Weg, um einen String in einen aufgezählten Wert umzuwandeln.

var colorName: string = "green";
var color: colors = colors.red;
if (colorName in colors) color = colors[colorName];

Die beiden oben genannten Situationen sind weitaus häufiger, da Sie in der Regel mehr am Namen eines bestimmten Werts interessiert sind und Werte auf generische Weise serialisieren.

99voto

Simon Punkte 1161

Wenn Sie nur nach den Namen suchen und später iterieren möchten, verwenden Sie:

Object.keys(myEnum).map(key => myEnum[key]).filter(value => typeof value === 'string') as string[];

64voto

Ryan Cavanaugh Punkte 204278

Angenommen, Sie halten sich an die Regeln und erstellen nur Enums mit numerischen Werten, können Sie diesen Code verwenden. Dieser behandelt den Fall korrekt, in dem Sie einen Namen haben, der zufälligerweise eine gültige Nummer ist

enum Color {
    Red,
    Green,
    Blue,
    "10" // wat
}

var names: string[] = [];
for(var n in Color) {
    if(typeof Color[n] === 'number') names.push(n);
}
console.log(names); // ['Red', 'Green', 'Blue', '10']

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