为何类型为any的函数参数必须传入?调用不传参报错原因
问题解答
核心原因
TypeScript的参数必填性检查和运行时参数默认值是完全独立的两个机制:
- 函数定义
param: any明确标记了这个参数是必填项,TypeScript的静态类型检查会严格校验调用时的参数数量,只要没传够定义里的参数个数就会报错——哪怕你知道运行时不传参的话参数会被设为undefined。 - 只有当参数被标记为可选(
param?: any)或者显式设置了默认值(param: any = undefined)时,TS才允许你不传这个参数。第三方库的函数没做这两种标记,所以必须传参。
可行的解决办法
因为你没法修改第三方库的函数定义,有几个实用的方案:
- 显式传入
undefined:就是你现在用的doSomething(undefined),这是最稳妥的方式,既满足TS的参数数量要求,运行时效果和不传参完全一致。 - 类型断言绕过检查:如果确定不传参是安全的,可以用类型断言告诉TS这个函数支持可选参数:
注意这种方式会关闭TS对这个函数的参数校验,只在你明确知道风险的情况下使用。(doSomething as (param?: any) => void)(); - 封装一层适配函数:自己写个包裹函数,把参数设为可选,内部帮你调用原函数:
之后直接调用function myDoSomething(param?: any) { return doSomething(param ?? undefined); }myDoSomething()就不会有TS报错,还能保留原函数的功能。
内容的提问来源于stack exchange,提问作者user2248702
相关产品推荐
相关产品推荐

