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

如何重载以函数为参数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:33:12