如何实现TypeScript重载函数中解构剩余参数的正确类型推断
解法
核心思路是通过类型映射将不同tool值对应的参数列表定义为元组类型,再将函数实现的rest参数和tool类型做关联,利用TypeScript的联合类型收窄能力自动推导对应位置的参数类型。
完整实现代码
// 定义tool值和对应参数元组的映射关系 type ToolArgsMap = { a: [poaram: boolean, poarama: number] b: [paramo: string, paramoa: string] } // 可选:保留原有重载保证调用提示和之前完全一致 function foo(tool: 'a', poaram: boolean, poarama: number): boolean function foo(tool: 'b', paramo: string, paramoa: string): boolean // 实现签名绑定tool和args的类型关联 function foo<T extends keyof ToolArgsMap>(tool: T, ...args: ToolArgsMap[T]): boolean { if (tool === 'a') { // 此处args被自动收窄为[boolean, number]类型 const [poaram, poarama] = args // 类型验证:poaram自动推导为boolean,poarama自动推导为number,无any类型 } if (tool === 'b') { // 此处args被自动收窄为[string, string]类型 const [paramo, paramoa] = args } return false }
原理解释
你提到的元组rest参数特性支持rest参数绑定为元组类型,我们正是利用了这个特性将args的类型从无约束的any[]替换为和tool关联的联合元组类型。当你通过tool === 'a'做类型收窄时,TypeScript会自动将args的类型同步收窄为'a'对应的元组类型,解构得到的变量自然会匹配对应的类型,不需要额外类型断言。
这种写法也完全兼容原有重载的调用校验效果,你调用foo时的参数类型校验和之前完全一致。
内容的提问来源于stack exchange,提问作者CodingMeSwiftly
相关产品推荐
相关产品推荐

