ts为什么keyof typeof可以拿到枚举的联合类型 ?

image.png
keyof typeof ab怎么解读呢 ?

export enum ab {
  'a',
  'b'
}

type uni = keyof typeof ab
阅读 6.1k
1 个回答

TypeScript 中分“类型”和“值”,类型是 TypeScript 认的,一般编译后会消失(不存在于 JS 中)。枚举是比较特殊的定义,虽然定义成类型,但实际是值,它在编译成 JS 之后是一个对象。

TypeScript 中的枚举还分情况,有数值型枚举,也有字符串型枚举,还有混合型的……不讨论复杂了,这里就说数值型的。

enum Hello {
    A,
    B
}

type X = keyof Hello;

你猜 X 是什么呢?你会发现它包含 toFixedtoPrecision 等,是不是感觉像是个 Number 类型的 Key 呢?

再来看看 Number 类型的 …… 果然一样

image.png

如果不加 Exclude 运算,会看到 keyof Number 看不到键列表

想想,实际上也是,如果这样使用

const a: Hello = Hello.A;

a 的值实际上是一个 Number(仅数值型枚举的情况)

所以 TypeScript 中需要使用 typeof Hello 来取实际的枚举类型(不然就是 Number 的子类型),实际上它是一个接口。

image.png

这个类型取出来之后,枚举值名称是被当作类型的 Key 的,所以可以用 keyof 把键值取出来。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题