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

如何用泛型实现TypeScript中接收枚举及对应处理函数的函数

解决方案:使用泛型绑定参数类型

你的问题出在原函数ff的类型定义上:f被要求接受E1 | E2类型的参数,但f1仅能处理E1、f2仅能处理E2,导致类型不兼容。通过泛型可以将枚举值的类型与处理函数的参数类型绑定,完美解决这个问题,且无需使用any。

修正后的代码

enum E1 {
  VALUE11 = "value1.1",
  VALUE12 = "value1.2"
}
enum E2 {
  VALUE21 = "value2.1",
  VALUE22 = "value2.2"
}

const f1 = (e: E1) => e;
const f2 = (e: E2) => e.toUpperCase();

// 泛型版本的ff函数,绑定枚举值类型与处理函数参数类型
const ff = <T extends E1 | E2>(e: T, f: (e: T) => unknown) => f(e);

console.log(ff(E1.VALUE11, f1)); // 类型检查通过
console.log(ff(E2.VALUE21, f2)); // 类型检查通过

更通用的版本(支持任意字符串枚举)

如果后续需要新增其他字符串枚举,无需修改ff函数,可以将泛型约束放宽为string(因为字符串枚举的成员本质是string的子类型):

const ff = <T extends string>(e: T, f: (e: T) => unknown) => f(e);

原理说明

  • 泛型T会自动推断为传入的枚举成员的具体类型(比如E1.VALUE11对应的类型是E1.VALUE11,而非宽泛的E1 | E2)。
  • 通过f: (e: T) => unknown,确保处理函数的参数类型与传入的枚举值类型完全匹配,TypeScript能正确进行类型校验,不会再出现类型不兼容的错误。

内容的提问来源于stack exchange,提问作者GRZa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:02:18