使用sinon.spy监听同名不同参重载方法时参数匹配报错如何解决
Sinon 监听重载函数的类型匹配解决方案
你遇到的报错本质是TypeScript类型层面的问题:JavaScript本身没有函数重载能力,多签名的draw方法是TypeScript提供的语法糖,所有重载最终都会映射到同一个运行时函数实现,因此sinon.spy运行时不可能单独监听某一个重载,只能捕获所有对draw方法的调用。
类型报错的原因是sinon默认会合并被监听方法的所有重载签名,生成的spy实例的断言方法(比如calledOnceWith)会要求入参兼容所有重载的参数约束,因此只符合单个重载的参数会被其他重载的类型规则拦截。
你可以通过以下几种方式解决类型报错问题:
- 方案1:创建spy时手动指定目标重载的类型
如果你需要多次用到该spy做同一重载的参数断言,可以直接在创建spy时声明对应的函数类型,覆盖sinon默认推断的合并重载类型:
该写法后续所有对spy的断言都会以你指定的重载类型为准,不会被其他重载的类型规则干扰。// 示例:指定匹配的重载签名为 (arg: ExpectedArgType) => void,替换为你实际的重载类型即可 const spy = sinon.spy<(expectedArgument: ExpectedArgType) => void>(obj, 'draw') - 方案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
相关产品推荐
相关产品推荐

