为何TypeScript中剩余参数可使用对象类型?附代码示例求解
关于TypeScript中
FnParamsToArrayParams类型的解析 先看你给出的TypeScript类型代码:
export type FnParamsToArrayParams<T> = T extends (...args: infer A) => infer R ? (...args2: { [K in keyof A]: Array<A[K]> }) => R : never
为什么...args2用对象类型却符合TS规则?
这里的核心是元组类型的映射特性:
- 从
(...args: infer A)推断出的A是元组类型(函数的参数列表在类型层面会被表示为元组)。 - 当对元组类型执行
{ [K in keyof A]: Array<A[K]> }这类映射操作时,TypeScript不会将其视为普通对象,而是生成一个新的元组类型。比如A如果是[number, string],映射后的结果就是[Array<number>, Array<string>]——本质还是数组/元组,完全符合TypeScript对剩余参数必须是数组类型的要求。
关于“保留...args参数名称”的误解
这里的args只是类型定义里的占位符,用来辅助推断参数的类型集合A,它不会被保留到最终生成的类型中。最终类型里的参数名称是args2,和原来的args没有关联,不存在“保留参数名称”的逻辑。
举个实际例子:
假设我们有函数类型(id: number, name: string) => void,将其传入FnParamsToArrayParams后,得到的类型是(...args2: [number[], string[]]) => void,完全符合剩余参数的类型规则。
内容的提问来源于stack exchange,提问作者Znar
相关产品推荐
相关产品推荐

