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] : '';
}
