Typescript比较两个不同的枚举,如果值相同则返回键

时间:2019-09-06 18:09:38

标签: typescript

我有2个不同的枚举,给定1个枚举,我想检查另一个枚举中是否存在该值并返回键。

function foo(enum2Value: enum2) {
    const enum1Key = Object.keys(enum1).find((key: any) => {
        return enum1[key] === enum2;
    });
    return enum1Key;
}

此代码有效。但我必须对任何事物都投下钥匙。如果我使用字符串,那么  enum1 [key] === enum2不起作用。比较两个不同的网络枚举的更好方法是什么

2 个答案:

答案 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

Playground