如何用TypeScript将枚举转换为键类型或值类型?
如何在TypeScript中将枚举转换为键联合类型或值联合类型
这问题我之前也碰到过,枚举在TypeScript里的类型处理逻辑和类确实有点区别,咱们一步步来实现你要的效果:
首先先明确你的枚举定义:
enum Roles { Admin = "admin", Client = "client" }
获取枚举的键联合类型("Admin"|"Client")
要拿到枚举的键(也就是你定义的枚举成员名称),需要先通过typeof Roles获取枚举对应的对象类型,再用keyof操作符提取它的键:
type RoleKeys = keyof typeof Roles; // 类型为 "Admin" | "Client"
解释一下:typeof Roles会返回包含枚举所有键值对的对象类型(类似{ Admin: "admin"; Client: "client" }),keyof作用在这个对象类型上,就能得到所有键的联合类型。
获取枚举的值联合类型("admin"|"client")
要拿到枚举的值的联合类型,我们可以在上面的基础上,用索引访问类型来提取所有键对应的值:
type RoleValues = Roles[keyof typeof Roles]; // 类型为 "admin" | "client"
这里的逻辑是:keyof typeof Roles得到了所有枚举键的联合,用这个联合去索引Roles,就会把每个键对应的值都取出来,最终形成值的联合类型。
为什么你之前的尝试不对?
你之前写的type values = {[K in Roles]: K},这里的K是枚举的值("admin"|"client"),所以你其实是在创建一个以枚举值为键、值本身为属性值的对象类型,结果自然是{ admin: "admin"; client: "client" },和你想要的值联合类型不符。而我们需要的是直接提取这些值的集合,所以用索引访问类型就可以实现。
内容的提问来源于stack exchange,提问作者Hisham Taha Kamal-Al-Din
相关产品推荐
相关产品推荐

