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"
}
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"
}
Ein andere interessante Lösung hier gefunden, ist die Verwendung von ES6 Map:
export enum Type {
low,
mid,
high
}
export const TypeLabel = new Map([
[Type.low, 'Nebensaison'],
[Type.mid, 'Mittelsaison'],
[Type.high, 'Hochsaison']
]);
VERWENDUNG
console.log(TypeLabel.get(Type.low)); // Nebensaison
TypeLabel.forEach((label, value) => {
console.log(label, value);
});
// Nebensaison 0
// Mittelsaison 1
// Hochsaison 2
In TypeScript wird ein enum in Javascript als Abbildung kompiliert (um den Wert aus dem Schlüssel zu erhalten):
enum MyEnum {
entry0,
entry1,
}
console.log(MyEnum['entry0']); // 0
console.log(MyEnum['entry1']); // 1
Es wird auch eine umgekehrte Abbildung erstellt (um den Schlüssel aus dem Wert zu erhalten):
console.log(MyEnum[0]); // 'entry0'
console.log(MyEnum[0]); // 'entry1'
Daher können Sie den Namen eines Eintrags abrufen, indem Sie Folgendes tun:
console.log(MyEnum[MyEnum.entry0]); // 'entry0'
console.log(MyEnum[MyEnum.entry1]); // 'entry1'
Allerdings hat ein string enum aus Designgründen keine umgekehrte Abbildung (siehe Kommentar und Pull-Request), da dies zu Konflikten zwischen Schlüsseln und Werten im Abbildungsobjekt führen könnte.
enum MyEnum {
entry0 = 'value0',
entry1 = 'value1',
}
console.log(MyEnum['value0']); // undefined
console.log(MyEnum['value1']); // undefined
Wenn Sie möchten, dass Ihr string enum eine umgekehrte Abbildung kompiliert (dann müssen Sie sicherstellen, dass alle Schlüssel und Werte unterschiedlich sind), können Sie diesen Trick verwenden:
enum MyEnum {
entry0 = 'value0',
entry1 = 'value1',
}
console.log(MyEnum['value0']); // 'entry0'
console.log(MyEnum['value1']); // 'entry1'
console.log(MyEnum[MyEnum.entry0]); // 'entry0'
console.log(MyEnum[MyEnum.entry1]); // 'entry1'
Ich war es leid, falsche Antworten zu durchsuchen, und habe es selbst gemacht.
Korrekt eingegeben.
type EnumKeys = Exclude
const enumObject = >(e: Enum) => { const copy = {...e} as { [K in EnumKeys>: Enum] }; Object.values(e).forEach(value => typeof value === 'number' && delete copy[value]); return copy; };
const enumKeys = >(e: Enum) => { return Object.keys(enumObject(e)) as EnumKeys[]; };
const enumValues = >(e: Enum) => { return [...new Set(Object.values(enumObject(e)))] as Enum[EnumKeys][]; };
enum Test1 { A = "C", B = "D"} enum Test2 { A, B } enum Test3 { A = 0, B = "C" } enum Test4 { A = "0", B = "C" } enum Test5 { undefined = "A" } enum Test6 { A = "undefined" } enum Test7 { A, B = "A" } enum Test8 { A = "A", B = "A" } enum Test9 { A = "B", B = "A" }
console.log(enumObject(Test1)); // {A: "C", B: "D"} console.log(enumObject(Test2)); // {A: 0, B: 1} console.log(enumObject(Test3)); // {A: 0, B: "C"} console.log(enumObject(Test4)); // {A: "0", B: "C"} console.log(enumObject(Test5)); // {undefined: "A"} console.log(enumObject(Test6)); // {A: "undefined"} console.log(enumObject(Test7)); // {A: 0,B: "A"} console.log(enumObject(Test8)); // {A: "A", B: "A"} console.log(enumObject(Test9)); // {A: "B", B: "A"}
console.log(enumKeys(Test1)); // ["A", "B"] console.log(enumKeys(Test2)); // ["A", "B"] console.log(enumKeys(Test3)); // ["A", "B"] console.log(enumKeys(Test4)); // ["A", "B"] console.log(enumKeys(Test5)); // ["undefined"] console.log(enumKeys(Test6)); // ["A"] console.log(enumKeys(Test7)); // ["A", "B"] console.log(enumKeys(Test8)); // ["A", "B"] console.log(enumKeys(Test9)); // ["A", "B"]
console.log(enumValues(Test1)); // ["C", "D"] console.log(enumValues(Test2)); // [0, 1] console.log(enumValues(Test3)); // [0, "C"] console.log(enumValues(Test4)); // ["0", "C"] console.log(enumValues(Test5)); // ["A"] console.log(enumValues(Test6)); // ["undefined"] console.log(enumValues(Test7)); // [0, "A"] console.log(enumValues(Test8)); // ["A"] console.log(enumValues(Test9)); // ["B", "A"]
Lass ts-enum-util
(github, npm) die Arbeit für Sie erledigen und viele zusätzliche typsichere Dienstprogramme bereitstellen. Funktioniert sowohl mit Zeichenketten- als auch mit numerischen Enums und ignoriert ordnungsgemäß die Einträge für den numerischen Index-Rückwärtssuchlauf bei numerischen Enums:
Zeichenketten-Enum:
import {$enum} from "ts-enum-util";
enum Option {
OPTION1 = 'this is option 1',
OPTION2 = 'this is option 2'
}
// Typ: ("OPTION1" | "OPTION2")[]
// Wert: ["OPTION1", "OPTION2"]
const keys= $enum(Option).getKeys();
// Typ: Option[]
// Wert: ["this is option 1", "this is option 2"]
const values = $enum(Option).getValues();
Numerisches Enum:
enum Option {
OPTION1,
OPTION2
}
// Typ: ("OPTION1" | "OPTION2")[]
// Wert: ["OPTION1", "OPTION2"]
const keys= $enum(Option).getKeys();
// Typ: Option[]
// Wert: [0, 1]
const values = $enum(Option).getValues();
Angenommen, Sie haben ein enum
export enum SCROLL_LABEL_OFFSET {
SMALL = 48,
REGULAR = 60,
LARGE = 112
}
und Sie möchten einen Typen basierend auf dem Enum erstellen, aber nicht einfach kopieren und einfügen. Sie könnten ein enum
verwenden, um Ihren Typ
wie folgt zu erstellen:
export type ScrollLabelOffset = keyof typeof SCROLL_LABEL_OFFSET;
Als Ergebnis erhalten Sie einen Typ
mit möglichen Werten wie 'SMALL' | 'REGULAR' | 'LARGE'
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.