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

如何在TypeScript中将枚举传入泛型函数并返回枚举类型?

修正枚举安全转换函数的返回类型推导问题

你遇到的核心问题是需要从枚举对象的类型(typeof MyEnum)中提取枚举成员的类型(MyEnum),可以通过索引访问类型EnumT[keyof EnumT]实现,同时调整泛型约束让类型推导更准确。

修正后的函数代码

function asEnum<EnumT extends Record<string | number | symbol, unknown>>(
  value: unknown,
  enumType: EnumT,
): EnumT[keyof EnumT] | undefined {
  if (Object.values(enumType).includes(value as EnumT[keyof EnumT])) {
    return value as EnumT[keyof EnumT];
  }
  return undefined;
}

关键调整说明

  1. 泛型约束优化:将原约束{ [K in symbol]: ItemT }替换为Record<string | number | symbol, unknown>,适配枚举键通常为字符串/数字的场景,避免类型过窄导致的推导问题。
  2. 提取枚举成员类型:EnumT[keyof EnumT]会自动提取枚举对象所有值的联合类型,也就是你需要的MyEnum类型(对应MyEnum.a | MyEnum.b | MyEnum.c)。
  3. 类型断言修正:返回时断言为枚举成员类型而非枚举对象类型,确保返回类型与实际返回值匹配。

测试验证

enum MyEnum {
  a = "eh",
  b = "bee",
  c = "see",
}

function main() {
  const value = "bee";
  const ev = asEnum(value, MyEnum); // 推导类型为 MyEnum | undefined,符合预期
}

可选:定义工具类型复用提取逻辑

如果需要多次提取枚举成员类型,可以单独定义工具类型:

type EnumMember<T> = T[keyof T];

// 使用工具类型的函数版本
function asEnum<EnumT extends Record<string | number | symbol, unknown>>(
  value: unknown,
  enumType: EnumT,
): EnumMember<EnumT> | undefined {
  if (Object.values(enumType).includes(value as EnumMember<EnumT>)) {
    return value as EnumMember<EnumT>;
  }
  return undefined;
}

内容的提问来源于stack exchange,提问作者edA-qa mort-ora-y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:25:21