You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态获取函数各参数类型并转换为键值对类型?

将函数参数转换为键值对类型的解决方案

首先明确: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:15:25