为何指定字符串不匹配包含该字符串的枚举类型?
为什么'FOO'不extends字符串枚举MyEnum?
先看你定义的字符串枚举:
enum MyEnum { foo = 'FOO', bar = 'BAR', }
核心原因是TypeScript字符串枚举的类型和它的字面量值类型不是一回事:
- 当你把
MyEnum当作类型使用时,它代表的是枚举成员自身的类型(比如MyEnum.foo、MyEnum.bar这种被TypeScript打上特殊标记的类型),而不是这些成员对应的值的字面量类型('FOO'、'BAR')。 - 简单说:
MyEnum类型的取值只能是MyEnum.foo或MyEnum.bar这两个枚举成员,而不是对应的字符串字面量'FOO'或'BAR'。所以'FOO'自然不属于MyEnum类型的子集,extends判断为false。
如果要判断字符串字面量是否属于枚举值的范围,你需要先获取枚举所有值的联合类型,也就是MyEnum[keyof MyEnum]:
type StringIsInEnum = 'FOO' extends MyEnum[keyof MyEnum] ? true : false; // true
这里keyof MyEnum会拿到枚举的所有键('foo'、'bar'),MyEnum[keyof MyEnum]就会取出每个键对应的值的类型,也就是'FOO' | 'BAR',此时'FOO'自然属于这个联合类型的子集,extends判断返回true。
内容的提问来源于stack exchange,提问作者WoodyWoodsta
相关产品推荐
相关产品推荐

