有没有办法在 typescript 中获取枚举的名称,例如 nameof(FirstEnum)
?下面的代码有一个丑陋的 if 开关,每次定义新的枚举时都必须扩展该开关。是否有更通用的方法可以在 typescript 中实现相同的目标?
enum FirstEnum {
First = 0,
Second = 1,
Third = 2,
}
enum SecondEnum {
One,
Two,
}
function translateEnum(type$, val): string {
let lookupKey = '';
if (type$ === FirstEnum) {
lookupKey = `firstenum.${FirstEnum[val]}`;
} else if (type$ === SecondEnum) {
lookupKey = `secondenum.${SecondEnum[val]}`;
} else {
throw new Error('not supported');
}
//lookupkey example: secondenum.One
const result = ''; //translate here, ex. await translationService.translate(lookupkey);
return result;
}
translateEnum(SecondEnum , SecondEnum.One);
最佳答案
自 Typescript Enums
被转换为 JavaScript 对象,您可以使用 in
检查 enum
键值是否是 enum
的成员运算符(operator)。请注意,这仅适用于非 const 且基于数字的枚举。
enum FirstEnum {
First = 0,
Second = 1,
Third = 2,
}
enum SecondEnum {
One,
Two,
}
function translateEnum(val: FirstEnum | SecondEnum): string {
let lookupKey = '';
if (val in FirstEnum || val in SecondEnum) {
console.log(`Enum value ${val} is valid!`);
//lookupkey example: secondenum.One
const result = ''; //translate here, ex. await translationService.translate(lookupkey);
return result;
} else {
console.log(`Enum value ${val} not supported.`);
throw new Error('not supported');
}
}
translateEnum(SecondEnum.One);
translateEnum(10);
输出
Enum value 0 is valid!
Enum value 10 not supported.
Uncaught Error: not supported
at translateEnum (eval at <anonymous> (main-0.js:804), <anonymous>:23:15)
at eval (eval at <anonymous> (main-0.js:804), <anonymous>:27:1)
at main-0.js:804
更多信息
查看堆栈溢出问题 Check if value exists in enum in TypeScript .
关于Typescript:如何检查一个值是否是有效的 Enum 键值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57636511/