You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在类型层面推导TypeScript枚举的值类型

问题

我想要创建一个名为EnumValues的泛型类型,它接受枚举实例作为参数,并输出该枚举的值类型。要求解决方案能将具体的枚举值字符串单独列出,而非合并为通用字符串类型。

示例枚举:

enum MyEnum {
    First = "first-value",
    Second = "second-value",
    Third = "third-value"
}

期望效果:

type EnumValues<T> = ...;

type MyEnumValues = EnumValues<MyEnum>; // 类型为 "first-value" | "second-value" | "third-value"

我尝试了以下写法,但均无效:

MyEnum[keyof MyEnum];
MyEnum[keyof typeof MyEnum];

解决方案

正确的泛型类型定义如下:

type EnumValues<T extends Record<string, string | number>> = T[keyof T];

说明

  • T extends Record<string, string | number> 用来约束泛型T必须是键为字符串、值为字符串或数字的对象,这刚好匹配TypeScript枚举的结构。
  • T[keyof T] 会提取T中所有键对应的值,形成它们的字面量联合类型,完美满足字符串枚举值的提取需求。

验证示例

将定义代入示例代码:

enum MyEnum {
    First = "first-value",
    Second = "second-value",
    Third = "third-value"
}

type EnumValues<T extends Record<string, string | number>> = T[keyof T];

type MyEnumValues = EnumValues<MyEnum>; 
// 自动推导为 "first-value" | "second-value" | "third-value"

无效写法原因

  • MyEnum[keyof MyEnum]:MyEnum是枚举实例,keyof MyEnum得到的是枚举值本身的类型(比如"first-value"),用枚举值去索引枚举实例逻辑错误,自然无法得到正确结果。
  • MyEnum[keyof typeof MyEnum]:typeof MyEnum是枚举的构造函数类型,keyof typeof MyEnum得到的是枚举的键名("First" | "Second" | "Third"),正确的类型写法应该是typeof MyEnum[keyof typeof MyEnum],但我们的泛型方案更通用,直接接受枚举实例作为参数即可。

内容的提问来源于stack exchange,提问作者Eliya Cohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:57:05