在类型层面推导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
相关产品推荐
相关产品推荐

