TS2554报错:定义2个入参的函数调用时提示期望0参数问题
TS2554报错:定义2个入参的函数却提示期望0个参数
问题场景
调用代码片段:
return await this.X.y( a, b, );
函数y的实现定义:
async y( a: string, b: B, ) { return await this.foo.put( `${this.config.foobar}/foo/${a}`, b, );
运行类型检查时报错:TS2554: Expected 0 arguments, but got 2
核心原因
TS没有读取到你写的带2个参数的y方法类型,它当前上下文里拿到的y的类型签名就是0个参数,才会抛出这个错误,常见触发场景:
- 给
this.X标注的类型本身错误,比如声明X的类型/接口时,把y错写成了无参函数y: () => Promise<xxx>,和实际实现不匹配 X实例是通过错误的类型断言生成的,比如写了this.X = someValue as WrongType这类代码,WrongType里的y定义就是无参,TS只会认你声明的断言类型,不会校验实际运行时的函数参数- 修改完
y的参数列表后,TS语言服务缓存未更新,还在使用之前y无参的旧类型信息 - 定义
y的类继承了父类、或者实现了某个接口,父类/接口中存在同名的无参y方法,TS优先采用父类/接口的类型定义,没有使用当前实现的参数类型
修复步骤
- 按住Ctrl点击代码中的
this.X,跳转到TS识别到的X的类型定义,再查看该类型下y方法的签名,90%的场景下在这里就能直接看到问题:TS读到的y确实是无参的,把对应类型定义改成和实际实现匹配即可。 - 如果跳转查看类型定义时,
y确实标注了2个参数,就是TS服务缓存异常,直接重启TS服务即可:VS Code中按快捷键调起命令面板(Windows/Linux为Ctrl+Shift+P,Mac为Cmd+Shift+P),搜索Restart TS Server执行,报错会自动消失。 - 如果是类继承、接口实现导致的同名方法冲突,要么调整父类/接口中
y的方法签名和当前实现对齐,要么修改当前方法名避免重名。
不要为了绕开报错随便给变量标注
any或者写不符合实际的类型断言,这类写法会让TS跳过正常的类型推导,直接使用你给出的错误类型,非常容易出现这类“实现和类型不匹配”的诡异报错。
内容的提问来源于stack exchange,提问作者Eww
相关产品推荐
相关产品推荐

