我有2个不同的枚举,给定1个枚举,我想检查另一个枚举中是否存在该值并返回键。
function foo(enum2Value: enum2) {
const enum1Key = Object.keys(enum1).find((key: any) => {
return enum1[key] === enum2;
});
return enum1Key;
}
此代码有效。但我必须对任何事物都投下钥匙。如果我使用字符串,那么 enum1 [key] === enum2不起作用。比较两个不同的网络枚举的更好方法是什么
答案 0 :(得分:1)
const enumValByKey = (k: string, o: object) =>
(k in o) ? (o as Record<typeof k, string | number>)[k] : null;
enumValByKey('ABC', enum1); // value of enum1.ABC, or null
不幸的是,我的解决方案仍然需要一个断言。 string | number
涵盖了我所知道的TS枚举。
好奇是否有一种无需断言就可以对此建模的方法。
答案 1 :(得分:0)
我不确定为什么要这么做,但是不用any
也可以做到。
function foo(enum2Value: enum2) {
const enum1Key = (Object.keys(enum1) as (keyof typeof enum1)[]).find(key => {
return enum1[key] === enum2Value as string;
});
return enum1Key;
}
首先,我们将Object.keys(enum1)
的结果强制转换为(keyof typeof enum1)[]
。现在,这意味着key
的所有可能值都是枚举enum1
的有效键。接下来,我们还必须将enum2Value
强制转换为string
,因为即使它的值是一个字符串,TypeScript也会将其视为枚举。
顺便说一句,我假设代码第三行的
enum2
是一个错字,实际上应该是enum2Value
。