export enum MyEnum{
Option1,
Option2,
Option3
}
string x = 'Option1';
MyEnum[x]
抛出错误:
类型字符串不能分配给类型MyEnum
但是:MyEnum['Option1']
可以工作。
我需要使用MyEnum[x]
(在一个返回MyEnum的方法中),其中x是一个计算值,它会导致一个有效的枚举选项,我该如何操作呢?
export enum MyEnum{
Option1,
Option2,
Option3
}
string x = 'Option1';
MyEnum[x]
抛出错误:
类型字符串不能分配给类型MyEnum
但是:MyEnum['Option1']
可以工作。
我需要使用MyEnum[x]
(在一个返回MyEnum的方法中),其中x是一个计算值,它会导致一个有效的枚举选项,我该如何操作呢?
4条答案
按热度按时间pxyaymoc1#
有两种优雅的方法可以实现这一点🚀
第️一种方法:只需简单地关闭下一行的类型检查,这类似于在@annepic的答案中AssertMyEnum的类型为
<any>
2nd️:如果你还想保留TS强大的类型检查功能,选择这个
typeof MyEnum
将创建表示幕后的MyEnum
对象的interface
,并且keyof
将返回字符串字面量的并集,每个字符串字面量是MyEnum
对象中的键(换句话说,keyof
将返回给定对象/类的keys**的列表)。**额外说明:**无论如何都要打开tsconfig中的
Strict
标志(你应该只在非常罕见和特殊的情况下忽略单行的类型检查,如上所述)。这种配置将迫使开发人员为所有代码定义shape/type
/structure/interface
,这使得整个代码库超级自文档化和自解释,特别是对于你未来的自我和代码维护者。你可以快速推断一个类/对象是如何构造的,以及一个函数是如何使用的,甚至不需要查看它的实现。JSDoc为使用注解来记录JS代码指定了一组非常严格的格式规则,但是这些注解通常最终会过时,因为它们不会沿着函数的发展而改变。Strict
标志的其他好处在TypeScript主文档中提到。toe950272#
您声明的字符串x变量是错误的。您应该执行以下操作:
vfhzx4xs3#
它是这样工作的:第一个月
jtjikinw4#
我认为您需要的是显式地将枚举中的选定项键入为该枚举。例如:
你引用的错误“Type string is not assignable to type MyEnum”实际上是来自函数返回类型与你的枚举不匹配。其他一些解决方案将枚举转换为对象,但这与具有相同枚举的返回类型的函数不兼容。