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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:54:04