typescript 按键动态访问打印脚本中的枚举

raogr8fs  于 2023-01-10  发布在  TypeScript
关注(0)|答案(4)|浏览(79)
export enum MyEnum{
    Option1,
    Option2,
    Option3
}

string x = 'Option1';

MyEnum[x]抛出错误:
类型字符串不能分配给类型MyEnum
但是:MyEnum['Option1']可以工作。
我需要使用MyEnum[x](在一个返回MyEnum的方法中),其中x是一个计算值,它会导致一个有效的枚举选项,我该如何操作呢?

pxyaymoc

pxyaymoc1#

有两种优雅的方法可以实现这一点🚀
第️一种方法:只需简单地关闭下一行的类型检查,这类似于在@annepic的答案中AssertMyEnum的类型为<any>

// @ts-ignore 
MyEnum[x]

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

MyEnum[x as keyof typeof MyEnum]

typeof MyEnum将创建表示幕后的MyEnum对象的interface,并且keyof将返回字符串字面量的并集,每个字符串字面量是MyEnum对象中的键(换句话说,keyof将返回给定对象/类的keys**的列表)。

**额外说明:**无论如何都要打开tsconfig中的Strict标志(你应该只在非常罕见和特殊的情况下忽略单行的类型检查,如上所述)。这种配置将迫使开发人员为所有代码定义shape/type/structure/interface,这使得整个代码库超级自文档化和自解释,特别是对于你未来的自我和代码维护者。你可以快速推断一个类/对象是如何构造的,以及一个函数是如何使用的,甚至不需要查看它的实现。JSDoc为使用注解来记录JS代码指定了一组非常严格的格式规则,但是这些注解通常最终会过时,因为它们不会沿着函数的发展而改变。Strict标志的其他好处在TypeScript主文档中提到。

toe95027

toe950272#

您声明的字符串x变量是错误的。您应该执行以下操作:

export enum MyEnum{
    Option1,
    Option2,
    Option3
}

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

vfhzx4xs3#

它是这样工作的:第一个月

jtjikinw

jtjikinw4#

我认为您需要的是显式地将枚举中的选定项键入为该枚举。例如:

export enum MyEnum{
  Option1,
  Option2,
  Option3
}

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

你引用的错误“Type string is not assignable to type MyEnum”实际上是来自函数返回类型与你的枚举不匹配。其他一些解决方案将枚举转换为对象,但这与具有相同枚举的返回类型的函数不兼容。

相关问题