如何在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; }
关键调整说明
- 泛型约束优化:将原约束
{ [K in symbol]: ItemT }替换为Record<string | number | symbol, unknown>,适配枚举键通常为字符串/数字的场景,避免类型过窄导致的推导问题。 - 提取枚举成员类型:
EnumT[keyof EnumT]会自动提取枚举对象所有值的联合类型,也就是你需要的MyEnum类型(对应MyEnum.a | MyEnum.b | MyEnum.c)。 - 类型断言修正:返回时断言为枚举成员类型而非枚举对象类型,确保返回类型与实际返回值匹配。
测试验证
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
相关产品推荐
相关产品推荐

