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

如何将类构造函数的参数类型转换为具名对象类型?

解决方案

要把ConstructorParameters返回的具名元组转换为对应的具名对象类型,你需要过滤掉元组的数字索引和数组内置属性,只保留元组的具名字段作为对象的键。可以通过自定义工具类型实现:

自定义工具类型实现

// 工具类型:将构造函数的具名元组参数转换为对象类型
type ConstructorParamsToNamedObject<T extends new (...args: any[]) => any> = {
  [K in Exclude<keyof ConstructorParameters<T>, keyof any[]>]: ConstructorParameters<T>[K]
};

使用示例

export default class Summator {
  constructor(private readonly firstArgument: number, private readonly secondArgument: number) {}

  get sum() {
    return this.firstArgument + this.secondArgument
  }
}

// 生成目标对象类型
type SummatorParams = ConstructorParamsToNamedObject<typeof Summator>;
// 最终类型:{ firstArgument: number; secondArgument: number }

为什么你的原写法不生效?

你之前的写法直接遍历ConstructorParameters<typeof Summator>的所有键,但元组类型的键默认包含数字索引("0"、"1")和数组的内置属性(比如length、push),因此得到了以数字为键的对象。而通过Exclude<keyof ConstructorParameters<T>, keyof any[]>可以精准筛选出元组的具名字段,排除掉无关的键。

另一种TypeScript 4.7+写法

如果你使用的是TypeScript 4.7及以上版本,还可以通过infer语法更灵活地提取元组的具名字段:

type ArgsToNamedObject<T> = T extends new (...args: infer P) => any
  ? { [K in keyof P as K extends string ? K : never]: P[K] }
  : never;

type SummatorParams = ArgsToNamedObject<typeof Summator>;
// 同样得到目标类型:{ firstArgument: number; secondArgument: number }

内容的提问来源于stack exchange,提问作者Bashtblrkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:55:42