如何将函数参数转换为对象类型而非数组类型?
将函数参数转换为对象类型的解决方案
你需要将函数的命名参数转换为对应的对象类型,但内置的Parameters工具仅返回元组类型,无法直接满足需求。以下是可行的解决方案:
场景说明
现有函数类型:
type PostX = ( arg1: string, arg2: number, arg3?: string, options?: AxiosRequestConfig ) => AxiosPromise<void>;
目标对象类型:
type ArgsType = { arg1: string; arg2: number; arg3?: string; options?: AxiosRequestConfig; };
解决方案
1. 手动映射(适用于已知参数名的场景)
直接通过Parameters提取每个参数的类型,手动构造对象类型:
type ArgsType = { arg1: Parameters<PostX>[0]; arg2: Parameters<PostX>[1]; arg3?: Parameters<PostX>[2]; options?: Parameters<PostX>[3]; };
这种方式直观可靠,完全符合需求,唯一的缺点是需要手动对应参数名和索引。
2. 通用工具类型(针对固定参数结构)
如果需要处理多个参数结构相同的函数,可以定义泛型工具类型,结合infer提取参数类型:
type ArgsToObject<T> = T extends ( arg1: infer A, arg2: infer B, arg3?: infer C, options?: infer D ) => any ? { arg1: A; arg2: B; arg3?: C; options?: D } : never; // 使用示例 type ArgsType = ArgsToObject<PostX>;
这种方式仅适用于参数数量、名称固定的函数,扩展性有限。
3. 修改函数定义(从根源避免转换)
如果可以控制函数的定义,直接让函数接受对象参数,后续使用更简洁:
type PostXArgs = { arg1: string; arg2: number; arg3?: string; options?: AxiosRequestConfig; }; type PostX = (args: PostXArgs) => AxiosPromise<void>;
补充说明
TypeScript的类型系统中,函数参数的名称仅作为语法标签存在,并未被编译为可访问的类型元数据,因此无法通过通用工具自动提取参数名作为对象的键。上述方案中,手动映射是最稳妥且贴合需求的选择。
内容的提问来源于stack exchange,提问作者Croviajo
相关产品推荐
相关产品推荐

