如何实现泛型类型以约束变量值为枚举中的任意类型?
实现枚举成员名称约束的泛型类型
要实现约束变量值为枚举成员名称的泛型类型,核心是过滤掉数字枚举的反向映射键,只保留枚举的原始成员名称。以下是具体实现:
enum SexTypes { Male, Female } // 泛型实现:提取数字枚举的成员名称联合类型 type TApplyEnumConstraint<T extends Record<string, number | string>> = keyof { [K in keyof T as T[K] extends number ? K : never]: never }
工作原理
- 泛型约束
T extends Record<string, number | string>确保传入的类型是枚举结构(键值对,值为数字或字符串)。 - 映射类型
[K in keyof T as T[K] extends number ? K : never]遍历枚举的所有键:- 当
T[K]是数字时,说明K是枚举的原始成员名称(数字枚举正向映射是名称→数字),保留该键; - 反向映射的键是数字类型,对应的
T[K]是字符串,会被过滤掉。
- 当
- 最后通过
keyof获取过滤后的键的联合类型,就是我们需要的枚举成员名称集合。
验证效果
let sex1: TApplyEnumConstraint<SexTypes> = "Male"; // ✅ 正常通过 let sex2: TApplyEnumConstraint<SexTypes> = "Female"; // ✅ 正常通过 let sex3: TApplyEnumConstraint<SexTypes> = "foo"; // ❌ 类型错误:"foo"不在联合类型中
如果是字符串枚举,无需过滤,直接用keyof T即可,但上述泛型同样兼容字符串枚举场景。
内容的提问来源于stack exchange,提问作者pepinillo6969
相关产品推荐
相关产品推荐

