我想用值搜索一个枚举,并获取它的键。这就是我现在拥有的:
private find(value: MyEnum): string {
for (const key in MyEnum) {
if (value === MyEnum[key]) {
return key;
}
}
return null;
}
我们不能简化它吗?这似乎是过度设计。.
实际上,我想要的只是Java中的value.name()。
编辑:MyEnum是这样的:
export enum MyEnum {
YES = 'x',
NO = 'y'
}
答案 0 :(得分:2)
如果您在运行时查看MyEnum
,那么它实际上将是这样的对象:
{ YES: 'x', NO: 'y' }
JavaScript中没有针对对象的自动反向查找,因此您需要编写类似find()
函数的函数来执行此操作。所以我认为没有比这更简单的了。
如果您的枚举为numeric,TypeScript会为您提供reverse mappings automatically:
enum MyEnum {
YES = 1,
NO = 0
}
const oneKey = MyEnum[1]; // "YES" (typed as string)
const zeroKey = MyEnum[0]; // "NO" (typed as string)
但是,您正在使用字符串枚举,所以这里没有神奇的答案。
如果您经常需要进行反向查找,并且不想继续遍历数组来执行此操作,则可以使用如下帮助函数预先构建反向映射对象:
type ReverseMapping<T extends Record<keyof T, keyof any>> = {
[K in T[keyof T]]: { [P in keyof T]: K extends T[P] ? P : never }[keyof T]
}
function reverseMapping<T extends Record<keyof T, keyof any>>(t: T): ReverseMapping<T> {
const ret = {} as ReverseMapping<T>;
(Object.keys(t) as Array<keyof T>).forEach(k => ret[t[k]] = k as any);
return ret;
}
然后像这样使用它:
// do this once
const reverseMyEnum = reverseMapping(MyEnum); // reverseMyEnum: { x: "YES", y: "NO" }
// reuse reverseMyEnum for reverse lookups:
const xKey = reverseMyEnum.x; // xKey: "YES"
const yKey = reverseMyEnum.y; // yKey: "NO"
const randKey = reverseMyEnum[Math.random() < 0.5 ? "x" : "y"]; // randKey: "YES" | "NO"
当然,reverseMapping()
函数可能比find()
更为“过度设计”,因此,是否值得这样做取决于您。除非我遇到某种问题(例如,从不断迭代到一个真正的枚举的性能),否则我将倾向于继续使用find()
(尽管类型更严格,并非您所要求的那样)。 ..不太可能)。
无论如何,希望能有所帮助。祝你好运!