Typescript中用变量作为jest.spyOn方法名参数报错如何解决?
问题原因
TypeScript 要求 jest.spyOn 的第二个参数必须是被监听对象实际存在的方法属性名的联合类型,将方法名存储为泛化的 string 类型变量时,类型范围过宽,TypeScript 无法确认该字符串是否为 myAPI 类上存在的合法方法名,因此抛出类型不匹配错误。
解决方案
方案1:限定变量类型(最推荐,自带类型校验)
直接将变量的类型限定为 myAPI 的属性名范围,写错方法名时 TypeScript 会提前报错:
// 写法1:适配所有属性名,包含非方法类型的属性 const theMethodName: keyof myAPI = 'someMethod' jest.spyOn(myAPI.prototype, theMethodName) // 写法2:更精准,仅适配方法类型的属性,完全匹配jest.spyOn的参数类型要求 type MethodKeysOf<T> = { [K in keyof T]: T[K] extends Function ? K : never }[keyof T] const theMethodName: MethodKeysOf<myAPI> = 'someMethod' jest.spyOn(myAPI.prototype, theMethodName)
方案2:使用类型断言(适用于确认变量值合法的场景)
如果已经确定变量存储的方法名一定合法,可以直接用类型断言跳过宽泛的类型校验:
const theMethodName : string = 'someMethod' // 基础断言写法 jest.spyOn(myAPI.prototype, theMethodName as keyof myAPI) // 更精准的断言写法 jest.spyOn(myAPI.prototype, theMethodName as MethodKeysOf<myAPI>)
方案3:收窄字面量类型
如果方法名变量是直接赋值的常量,可以用 as const 把类型从泛化的 string 收窄为字符串字面量类型,TypeScript 可直接识别为合法参数:
const theMethodName = 'someMethod' as const jest.spyOn(myAPI.prototype, theMethodName)
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

