【问题标题】:Typescript Compare two different enums and return the key if same value打字稿比较两个不同的枚举,如果值相同则返回键
【发布时间】:2020-01-09 14:42:10
【问题描述】:

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

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

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

【问题讨论】:

  • 你违背了语言,可能会滥用枚举。您通常不依赖枚举的基础值。这就是为什么具有相同值的枚举成员不被认为是相同的......正如您所知,您可能应该只处理地图
  • 考虑将此代码设置为minimal reproducible example,其中唯一存在的问题是您需要帮助的问题;目前,enum1enum2 尚未定义。

标签: typescript


【解决方案1】:

我不确定您究竟为什么要这样做,但没有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

【讨论】:

    【解决方案2】:
    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 枚举。

    很好奇是否有一种方法可以在没有断言的情况下对此进行建模。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多