如何将类构造函数的参数类型转换为具名对象类型?
解决方案
要把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
相关产品推荐
相关产品推荐

