'How to get enum key by value in Typescript?
I have an enum like this:
export enum Colors {
RED = "RED COLOR",
BLUE = "BLUE COLOR",
GREEN = "GREEN COLOR"
}
Could you let me know how to get enum key by value please? i.e., I need to pass "BLUE COLOR" and get 'BLUE'.
Colors["BLUE COLOR"]
gives error Element implicitly has an 'any' type because expression of type '"BLUE COLOR"' can't be used to index type 'typeof Colors'. Property 'BLUE COLOR' does not exist on type 'typeof Colors'.
Solution 1:[1]
If you want to get your
enum key
byvalue
in that case you have to re write your enum in following manners: But same format also might be work in older version as well.
For Vanilla Js it should be like below:
enum Colors {
RED = "RED COLOR",
BLUE = "BLUE COLOR",
GREEN = "GREEN COLOR"
}
For .tsx it should be like below:
enum Colors {
RED = "RED COLOR" as any,
BLUE = "BLUE COLOR" as any,
GREEN = "GREEN COLOR" as any
}
For .ts it should be like below:
enum Colors {
RED = <any>"RED COLOR",
BLUE = <any>"BLUE COLOR",
GREEN = <any>"GREEN COLOR"
}
Then you can get like this way:
Retrieve enum key by value:
let enumKey = Colors["BLUE COLOR"];
console.log(enumKey);
Output:
Another way: Retrieve enum key by value:
let enumKey = Object.keys(Colors)[Object.values(Colors).indexOf("BLUE COLOR")];
console.log(enumKey);
Output:
Test on jsfiddle:
Solution 2:[2]
const findMe = Object.keys(Colors)[Object.values(Colors).indexOf("BLUE COLOR")];
Solution 3:[3]
I am using this function
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 with 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');
});
});
Hope it helps someone
Solution 4:[4]
Improved getEnumKeyByEnumValue without using 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] : '';
}
Solution 5:[5]
You can do something like this fetching the enum keys:
enum Colors {
RED = "RED COLOR",
BLUE = "BLUE COLOR",
GREEN = "GREEN COLOR"
}
for (let item in Colors) {
if (Colors[item] === "BLUE COLOR") {
alert(item)
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Anna |
Solution 3 | Nux |
Solution 4 | Nazarii Repak |
Solution 5 | Emanuele Scarabattoli |