【问题标题】:dynamically access enum in typescript by key按键动态访问打字稿中的枚举
【发布时间】:2018-10-29 05:53:23
【问题描述】:
export enum MyEnum{
    Option1,
    Option2,
    Option3
}


string x = 'Option1';

MyEnum[x] 抛出错误:

类型字符串不可分配给类型 MyEnum

然而: MyEnum['Option1'] 有效。

我需要使用MyEnum[x](在一个返回 MyEnum 的方法中),其中 x 是一个计算值,会产生一个有效的枚举选项,我该怎么做?

【问题讨论】:

标签: typescript enums


【解决方案1】:

您正在声明您的字符串 x 变量错误。你应该这样做:

export enum MyEnum{
    Option1,
    Option2,
    Option3
}


var x = 'Option1';
MyEnum[x];

【讨论】:

  • 谢谢,但它不是这样工作的。 x 是在方法之外计算的,所以也许这就是原因。有趣的是,如果我之前给 x 赋值 'Opt'+'ion1',那么 MyEnum[x] 会突出显示语法错误。串联给出了一个有效的值,但是 typescript 不关心分析它,直接显示语法错误。
【解决方案2】:

让它像这样工作:return (<any>MyEnum)[x];

【讨论】:

  • const key = computedkey(); return Object(MyEnum)[key];为我工作
【解决方案3】:

我认为您正在寻找的是在您的枚举中明确键入所选项目作为该枚举。示例:

export enum MyEnum{
  Option1,
  Option2,
  Option3
}

function getEnum(x = 'Option1'):MyEnum {
  return <MyEnum>MyEnum[x];
}

您引用的错误“类型字符串不可分配给类型 MyEnum”实际上来自与您的枚举不匹配的函数返回类型。其他一些解决方案将枚举转换为对象,但与具有相同枚举返回类型的函数不兼容。

【讨论】:

    【解决方案4】:

    有两种优雅的方法可以实现这一点?

    ⭐️ 第一种方式:只需简单地关闭下一行的类型检查,这类似于在 @annepic 的答案中将 MyEnum 的类型断言为 &lt;any&gt;

    // @ts-ignore 
    MyEnum[x] 
    

    ⭐️2nd:如果你还想保留TS强大的类型检查功能,选择这个

    MyEnum[x as keyof typeof MyEnum] 
    

    typeof MyEnum 将创建一个 interface 来表示幕后的 MyEnum 对象,keyof 将返回字符串文字的并集,每个都是 MyEnum 对象中的键(换句话说, keyof 将返回给定对象/类的键列表。

    额外说明:无论如何都要在 tsconfig 中打开Strict 标志(你应该只在非常罕见和特殊情况下忽略单行的类型检查,如上所述)。这种配置将迫使开发人员为所有内容定义形状/类型/结构,这使得整个代码库超级自文档化和自解释,特别是对于您未来的自我和代码维护者。 U 可以快速推断出类/对象的结构以及函数的使用方式,100% 确定性,甚至无需查看其实现。 JSDoc 为使用 cmets 记录 JS 代码指定了一套非常严格的格式规则,但是这些 cmets 往往最终会过时,因为它们没有随着功能的演变而改变。 Strict 标志的其他好处在TypeScript primary doc 中提到。

    【讨论】:

    • 喜欢keyof typeof 组合
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2020-05-09
    • 2022-08-03
    • 2020-01-29
    相关资源
    最近更新 更多