TypeScript扩展参数类型报错:如何解决fn(...args)类型不匹配问题?
解决TypeScript中
fn(...args)的类型不兼容错误 错误原因
这个错误是因为TypeScript无法在泛型上下文中,将联合类型的元组参数与联合类型的函数做精准匹配:
Type[K]是(a: number, b: number, c: number) => void和() => void的联合类型Parameters<Type[K]>是[number, number, number]和[]的联合类型
当展开联合元组调用联合函数时,TS无法确保参数与函数的类型一一对应,因此抛出类型错误。
解决方法
方法1:类型断言快速修复
直接通过类型断言告诉TS,当前的args与fn的参数类型完全匹配:
function test2<K extends keyof Type>(key: K, ...args: Parameters<Type[K]>) { const fn: Type[K] = o[key]; (fn as (...args: typeof args) => void)(...args); }
方法2:用条件类型强化泛型关联
重构泛型定义,通过条件类型显式推导函数对应的参数类型,再结合断言让TS认可匹配关系:
function test2<K extends keyof Type>( key: K, ...args: Type[K] extends (...args: infer P) => void ? P : never ) { const fn = o[key]; (fn as (...args: typeof args) => void)(...args); }
方法3:函数重载(类型最安全)
如果对象o中的函数数量不多,直接为test2定义重载签名,TS会在调用时提供精准的参数校验:
// 重载签名 function test2(key: 'test', a: number, b: number, c: number): void; function test2(key: 'test1'): void; // 实现签名 function test2<K extends keyof Type>(key: K, ...args: Parameters<Type[K]>) { const fn = o[key]; fn(...args as any); }
内容的提问来源于stack exchange,提问作者lhf6623
相关产品推荐
相关产品推荐

