如果我有枚举:

enum MyEnum {
  foo = 'FOO',
  bar = 'BAR',
}

常量字符串确认测试的结果如下:

type StringIsInEnum = 'FOO' extends MyEnum ? true : false; // false

有人能解释一下为什么在这种情况下,'FOO'不是MyEnum的延伸吗?

MyEnum.foo在运行时不会改变,'FOO'是一个常量值,因此也永远不会改变.

推荐答案

虽然Typescript 通常是100种语言,但enum是一个例外.它们被设计为nominalopaque.因此,您不能将它们与字符串值进行比较.

然而,有一些变通办法...

enum MyEnum {
  foo = 'FOO',
  bar = 'BAR',
}

type StringIsInEnum = 'FOO' extends `${MyEnum}` ? true : false; // true

TypeScript Playground

Typescript相关问答推荐

类型是工作.但它失go 了正确变体的亮点..为什么?或者如何增强?

等待的R没有用响应对象展开到R

更新:Typescript实用程序函数合并对象键路径

如何在第一次加载组件时加载ref数组

动态调用类型化函数

异步动态生成Playwright测试,显示未找到测试

有没有办法解决相互影响的路由之间的合并?

Angular 错误NG0303在Angular 项目中使用app.Component.html中的NGFor

在分配给类型的只读变量中维护const的类型

迭代通过具有泛型值的映射类型记录

如何在ANGLE中注册自定义验证器

类型';字符串|数字';不可分配给类型';未定义';.类型';字符串';不可分配给类型';未定义';

将布尔值附加到每个对象特性

如何键入并类型的函数&S各属性

为什么看起来相似的代码在打字时会产生不同的错误?

如何使对象同时具有隐式和显式类型

通过函数传递确切的类型,但验证额外的字段

为什么我会得到一个;并不是所有的代码路径都返回一个值0;switch 中的所有情况何时返回或抛出?(来自vsCode/TypeScript)

什么';是并类型A|B的点,其中B是A的子类?

React router - 如何处理嵌套路由?