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

如何实现泛型类型以约束变量值为枚举中的任意类型?

实现枚举成员名称约束的泛型类型

要实现约束变量值为枚举成员名称的泛型类型,核心是过滤掉数字枚举的反向映射键,只保留枚举的原始成员名称。以下是具体实现:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:57:36