如何重载以函数为参数的TypeScript函数?解决签名不兼容问题
TypeScript函数重载修复方案(接收函数参数场景)
你的重载签名和实现签名不兼容的核心原因:实现签名里的fn: (a: string | number) => void要求函数能同时处理string和number类型,但重载的两个签名分别只要求函数处理单一类型——比如第一个重载的fn只能接收string,无法处理number,这就和实现签名的宽泛要求冲突了。
修复后的代码如下:
function myFunction(fn: (a: string) => void, value: string): void; function myFunction(fn: (a: number) => void, value: number): void; function myFunction( fn: ((a: string) => void) | ((a: number) => void), value: string | number ): void { // 实现内部需做类型窄化,确保fn与value类型匹配 if (typeof value === 'string') { (fn as (a: string) => void)(value); } else { (fn as (a: number) => void)(value); } }
修复逻辑说明
- 实现签名的
fn改为两个重载函数类型的联合,value对应改为string/number的联合,既满足重载的约束,又不会要求函数必须同时兼容两种类型。 - 实现内部通过
typeof value做类型窄化,再通过类型断言将fn转为对应类型(这里的断言是安全的,因为重载已经保证了调用时fn和value的类型是匹配的)。
内容的提问来源于stack exchange,提问作者kspacja
相关产品推荐
相关产品推荐

