如何用泛型实现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
相关产品推荐
相关产品推荐

