TypeScript联合函数类型调用时提示参数数量错误如何解决?
报错原因
TypeScript 调用联合类型的函数时,要求传入的参数必须满足联合内所有函数类型的参数要求。你定义的GetMultipleFunction是两类函数的联合:
- 无参数、返回字符串数组的函数
- 接收1个number类型参数、返回字符串数组的函数
在test函数内直接调用func()时,TS 无法判断当前传入的func属于哪一类,如果是需要参数的第二类函数,不传参数调用会引发运行时错误,因此提前抛出类型校验失败提示。
需求实现方案
你的需求完全可以实现,最推荐的类型安全方案是使用函数重载匹配两种调用场景,修改后的代码如下:
type GetMultipleFunction1 = () => string[]; type GetMultipleFunction2 = (data: number) => string[]; // 重载1:匹配无参函数的调用场景,不需要传第二个参数 function test(func: GetMultipleFunction1): string[]; // 重载2:匹配带参数函数的调用场景,必须传第二个number类型参数 function test(func: GetMultipleFunction2, data: number): string[]; // 实现签名,兼容两种重载逻辑即可 function test(func: (data?: number) => string[], data?: number): string[] { if (data !== undefined) return func(data); return func(); } function getStrings1(data: number): string[] { return [`hello-${data}`, 'hi']; } function getStrings2(): string[] { return ['hello', 'hi'] } // 调用时自动匹配对应重载,类型校验正常 test(getStrings1, 2); test(getStrings2);
如果你用的是最初的异步返回Promise的版本,按照同样的逻辑修改返回值类型即可。
适配Vue3请求封装场景
这种重载方案完全匹配你的请求封装需求:
- 调用无参数的接口(比如
/api/groups/)时,直接传无参请求函数即可 - 调用需要参数的接口(比如
/api/groups/3/members/)时,必须传入对应的数字参数,TS 会自动帮你校验参数完整性,避免漏传参数的运行时问题。
内容的提问来源于stack exchange,提问作者danielmoessner
相关产品推荐
相关产品推荐

