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

使用sinon.spy监听同名不同参重载方法时参数匹配报错如何解决

Sinon 监听重载函数的类型匹配解决方案

你遇到的报错本质是TypeScript类型层面的问题:JavaScript本身没有函数重载能力,多签名的draw方法是TypeScript提供的语法糖,所有重载最终都会映射到同一个运行时函数实现,因此sinon.spy运行时不可能单独监听某一个重载,只能捕获所有对draw方法的调用。
类型报错的原因是sinon默认会合并被监听方法的所有重载签名,生成的spy实例的断言方法(比如calledOnceWith)会要求入参兼容所有重载的参数约束,因此只符合单个重载的参数会被其他重载的类型规则拦截。
你可以通过以下几种方式解决类型报错问题:

  • 方案1:创建spy时手动指定目标重载的类型
    如果你需要多次用到该spy做同一重载的参数断言,可以直接在创建spy时声明对应的函数类型,覆盖sinon默认推断的合并重载类型:
    // 示例:指定匹配的重载签名为 (arg: ExpectedArgType) => void,替换为你实际的重载类型即可
    const spy = sinon.spy<(expectedArgument: ExpectedArgType) => void>(obj, 'draw')
    
    该写法后续所有对spy的断言都会以你指定的重载类型为准,不会被其他重载的类型规则干扰。
  • 方案2:单条断言处做临时类型断言
    如果你只是某一条断言需要匹配特定重载,不需要修改spy的全局类型,可以在断言时给spy做临时类型转换:
    expect(
      (spy as sinon.SinonSpy<[ExpectedArgType], void>).calledOnceWith(expectedArgument)
    ).toBeTruthy()
    
  • 方案3:跳过当前行的类型校验
    如果你更关注运行时的调用结果是否符合预期,不想处理类型约束,可以在断言行上方加注释跳过类型检查:
    // @ts-expect-error 仅匹配指定重载参数,忽略其他重载的类型校验
    expect(spy.calledOnceWith(expectedArgument)).toBeTruthy()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:15:04