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

在Typescript中如何包装拥有多重重载的函数?

原因说明

TypeScript 现阶段不支持自动关联重载函数的联合参数配对关系,你定义的两个参数elem和handler是独立的联合类型,TS 无法识别二者是否匹配同一条重载规则,因此直接调用原函数会抛出类型不匹配的错误。

最简实现方案

由于你已经保证包装函数的重载签名和被包装函数完全一致,所有传入的参数必然符合原函数的某一条重载规则,仅需添加一次类型断言即可省略所有类型守卫代码,还可以自由插入自定义行为:

function handleMainEvent2(
  elem: HTMLFormElement,
  handler: FormSubmitHandler
)
function handleMainEvent2(
  elem: HTMLIFrameElement,
  handler: MessageHandler
)
function handleMainEvent2(
  elem: HTMLFormElement | HTMLIFrameElement,
  handler: FormSubmitHandler | MessageHandler
) {
  // 可在此处添加自定义前置逻辑
  const result = (handleMainEvent as typeof handleMainEvent2)(elem, handler)
  // 可在此处添加自定义后置逻辑
  return result
}

通用封装方案

如果需要对多个同类型重载函数做统一包装,可以抽离通用包装函数避免重复编写代码:

// 提前定义原函数类型方便复用
type HandleMainEventFn = typeof handleMainEvent

function wrapEventHandle<F extends HandleMainEventFn>(fn: F): F {
  return function wrapped(elem: any, handler: any) {
    // 统一插入自定义前置逻辑
    const result = fn(elem, handler)
    // 统一插入自定义后置逻辑
    return result
  } as F
}

// 直接生成包装后的函数,无需重复声明重载
const handleMainEvent2 = wrapEventHandle(handleMainEvent)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:09:04