Website-Suche

Wie bekommt man den Enum-Schlüssel nach Wert in TypeScript?


Ich habe ein Enum wie dieses:

export enum Colors {
    RED = "RED COLOR",
    BLUE = "BLUE COLOR",
    GREEN = "GREEN COLOR"
}

Könnten Sie mir bitte sagen, wie man den Enum-Schlüssel anhand des Werts erhält? Das heißt, ich muss "BLUE COLOR" übergeben und 'BLUE' bekommen.

Colors["BLAUE FARBE"] gibt den Fehler Element hat implizit einen 'any'-Typ, weil der Ausdruck vom Typ '"BLAUE FARBE"' nicht als Index für den Typ 'typeof Colors' verwendet werden kann. Die Eigenschaft 'BLAUE FARBE' existiert nicht im Typ 'typeof Colors'.

Antwort #1

Wenn Sie in diesem Fall Ihren Enum-Schlüssel anhand des Werts abrufen möchten, müssen Sie Ihr Enum wie folgt umschreiben: Aber dasselbe Format könnte auch in älteren Versionen funktionieren.

Für Vanilla Js sollte es wie folgt sein: :

 enum Colors {
    RED = "RED COLOR",
    BLUE = "BLUE COLOR",
    GREEN = "GREEN COLOR"
}

Für .tsx sollte es wie unten sein: :

 enum Colors {
        RED = "RED COLOR" as any,
        BLUE = "BLUE COLOR" as any,
        GREEN = "GREEN COLOR" as any
    }

Für .ts sollte es wie unten sein: :

enum Colors {
  RED = <any>"RED COLOR",
  BLUE = <any>"BLUE COLOR",
  GREEN = <any>"GREEN COLOR"
}

Dann kannst du es auf diese Weise bekommen:

Enum-Schlüssel nach Wert abrufen: :

let enumKey = Colors["BLUE COLOR"];
    console.log(enumKey);

Ausgabe: :

Eine andere Möglichkeit: Abrufen des Enum-Schlüssels nach Wert: :

let enumKey = Object.keys(Colors)[Object.values(Colors).indexOf("BLUE COLOR")];

console.log(enumKey);

Ausgabe: :

Test auf jsfiddle: :

Codierungsbeispiel auf jsfiddle

Hinweis: Am 25. August wurden neue Ankündigungen mit TypeScript 4.8 veröffentlicht. Bitte beachten Sie dies. Sie können hier einen Blick darauf werfen.

Antwort #2

const findMe = Object.keys(Colors)[Object.values(Colors).indexOf("BLUE COLOR")];

https://jsfiddle.net/anniebbird/agy3unfk/3/

Antwort #3

Ich benutze diese Funktion

export function getEnumKeyByEnumValue(myEnum: any, enumValue: number | string): string {
  let keys = Object.keys(myEnum).filter((x) => myEnum[x] == enumValue);
  return keys.length > 0 ? keys[0] : '';
}

Tests mit Jest

describe('enum', () => {
  enum TestEnumWithNumber {
    ZERO
  }

  enum TestEnumWithString {
    ZERO = 'ZERO'
  }

  it('should return correct key when enum has number values', function() {
    const key = getEnumKeyByEnumValue(TestEnumWithNumber, TestEnumWithNumber.ZERO);
    expect(key).toBe('ZERO');
  });

  it('should return correct key when enum has string values', function() {
    const key = getEnumKeyByEnumValue(TestEnumWithString, TestEnumWithString.ZERO);
    expect(key).toBe('ZERO');
  });

  it('should return correct key by passing corresponding string value', function() {
    const key = getEnumKeyByEnumValue(TestEnumWithString, 'ZERO');
    expect(key).toBe('ZERO');
  });
});

Hoffe, es hilft jemandem

Antwort #4

Verbessertes getEnumKeyByEnumValue ohne Verwendung von any:

export function getEnumKeyByEnumValue<
  TEnumKey extends string,
  TEnumVal extends string | number
>(myEnum: { [key in TEnumKey]: TEnumVal }, enumValue: TEnumVal): string {
  const keys = (Object.keys(myEnum) as TEnumKey[]).filter(
    (x) => myEnum[x] === enumValue,
  );
  return keys.length > 0 ? keys[0] : '';
}

Verwandte Artikel