如何将TypeScript中Parameters<T>返回的参数类型数组转为对象类型?
问题描述
TypeScript 的工具类型 Parameters<T> 会返回函数的参数类型元组,示例如下:
const f = (a: number, b: boolean) => { //... } // 类型为 [a: number, b: boolean] type FParams = Parameters<typeof f>;
我需要把这种具名参数元组类型转换为对应的对象类型,即实现如下转换:
[a: number, b: boolean] -> { a: number, b: boolean }
尝试过一些已有的类型转换方案,但均不适用当前需求。
解决方案
可以结合 TypeScript 的元组标签提取、映射类型与条件类型实现该转换,以下是具体的类型工具实现:
type ParamsToObject<T extends readonly unknown[]> = { [K in keyof T as T[K] extends infer U ? (U extends { [key: string]: any } ? never : K) : K]: T[K] } extends infer O ? { [K in keyof O as O[K] extends undefined ? never : K]: O[K] } : never;
实现原理
- 元组标签提取:具名元组的类型键包含数字索引与参数名称字符串键,比如
[a: number, b: boolean]的keyof结果为"0" | "1" | "a" | "b"。 - 过滤无效键:通过条件类型过滤掉数字索引键,仅保留参数名称的字符串键,同时排除可选参数带来的
undefined值干扰。 - 映射生成对象:将保留的参数名称作为对象属性名,对应元组中的类型作为属性值,最终生成目标对象类型。
验证示例
const f = (a: number, b: boolean) => { /*...*/ }; type FParams = Parameters<typeof f>; // 类型为 { a: number; b: boolean } type FParamsObj = ParamsToObject<FParams>; // 带可选参数的场景 const g = (x: string, y?: number) => { /*...*/ }; type GParamsObj = ParamsToObject<Parameters<typeof g>>; // 类型为 { x: string; y?: number | undefined }
内容的提问来源于stack exchange,提问作者Mero
相关产品推荐
相关产品推荐

