如何动态获取函数各参数类型并转换为键值对类型?
将函数参数转换为键值对类型的解决方案
首先明确:TypeScript类型系统中,函数参数的名称不属于类型信息范畴,因此无法直接通过类型工具动态提取参数名称作为对象的键。不过可以根据你的需求提供两种可行方案:
方案一:固定参数个数的手动映射(匹配你的期望输出)
如果函数参数个数固定,可以基于Parameters工具类型提取的元组,手动映射到目标对象类型:
type IFoo = { foo: (a: number, b: string) => void }; // 从元组中按索引提取参数类型,手动指定对象键名 type IBar = { a: Parameters<IFoo['foo']>[0], b: Parameters<IFoo['foo']>[1] }; // 最终IBar类型为:{ a: number; b: string; }
方案二:通用索引式对象(适配任意参数个数)
如果需要适配任意参数个数的函数,但接受用参数索引作为对象键:
type IFoo = { foo: (a: number, b: string) => void }; // 将参数元组转换为以数字索引为键的对象 type ParamsToIndexedObject<F extends (...args: any[]) => any> = { [K in keyof Parameters<F> as K extends `${infer N}` ? N : never]: Parameters<F>[K]; }; type IBarIndexed = ParamsToIndexedObject<IFoo['foo']>; // 最终IBarIndexed类型为:{ "0": number; "1": string; }
更优的类型关联方式
如果希望函数参数和对象类型保持动态一致,建议先定义对象类型,再基于对象类型推导函数参数,避免重复定义:
// 先定义目标对象类型 type IBar = { a: number, b: string }; // 基于对象类型定义函数参数 type IFoo = { foo: (args: IBar) => void };
这样既能保证类型一致性,也能直接得到你需要的IBar类型。
内容的提问来源于stack exchange,提问作者user24015970
相关产品推荐
相关产品推荐

