在 TypeScript 中根据值获取枚举的键
我有以下枚举
export enum Operators {
Equal = "1",
NotEqual = "2",
GreatherOrEqual = "3",
LessOrEqual = "4",
Contains = "5",
Null = "6",
NotNull = "7",
Between = "8",
StartsWith = "9",
EndsWith = "10"
}
我需要从存储的值中恢复枚举键。我已经创建了以下内容:
GetEnumTextByValue ( valueOperator: string ): string {
const values: string[] = Object.values( Operators ).filter( v => v == v );
const keys: string[] = Object.keys( Operators ).filter( k => k == k );
const index: number = values.indexOf( valueOperator );
return keys[ index ];
}
这个函数返回了我需要的内容,但有没有更简单的方法来获取这个键?
答案#1
我正在为任何枚举使用这个函数
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] : '';
}
使用 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');
});
});
答案#2
你可以结合使用 Object.entries 和 Map:
const operators = new Map(
Object.entries(Operators)
.map(entry => entry.reverse()) as [Operators, keyof typeof Operators][]
);
console.log(
operators.get(Operators.Between) // Between
)
请注意,当你的枚举包含数字而不是字符串时,这更容易做到。
export enum Operators {
Equal = 1,
NotEqual = 2,
GreatherOrEqual = 3,
LessOrEqual = 4,
Contains = 5,
Null = 6,
NotNull = 7,
Between = 8,
StartsWith = 9,
EndsWith = 10
}
Operators[Operators.Between]; // "Between"
