727 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"
}

18voto

manzapanza Punkte 6007

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

16voto

Valentin Vignal Punkte 2722

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'

16voto

polkovnikov.ph Punkte 5666

Ich war es leid, falsche Antworten zu durchsuchen, und habe es selbst gemacht.

  • DIESEN HAT TESTS.
  • Funktioniert mit allen Arten von Aufzählungen.
  • 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"]

Online Version.

16voto

Jeff Lau Punkte 432

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();

13voto

Volodymyr Khmil Punkte 1020

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.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