能否将TypeScript的Parameters<>元组类型转换为Record类型?
从TypeScript参数类型生成对应Record类型
给定示例函数:
function foo(x: number, y: number) {}
你希望实现RecordFromTuple类型,让RecordFromTuple<Parameters<typeof foo>>等价于{ x: number, y: number },但这里存在TypeScript类型系统的核心限制:
核心限制说明
Parameters<typeof foo>返回的是命名元组类型[x: number, y: number],但元组的命名元素只是语法层面的可读性提示,并没有在类型系统中作为可访问的键存在。该元组的类型键仅包含数字索引(0、1)、数组内置属性(如length)等,无法直接提取x、y这些参数名作为Record的键。
可行替代方案
如果你的核心需求是将函数参数转换为键值对类型,可以跳过Parameters,直接从函数类型出发实现类型转换:
固定参数数量场景
如果函数参数数量固定,可直接通过infer提取每个参数的类型并映射为Record:
// 辅助类型:支持2个参数的函数转换 type ParamsToRecord<F extends (...args: any[]) => any> = F extends (x: infer X, y: infer Y) => any ? { x: X, y: Y } : never; // 使用示例 type FooParamsRecord = ParamsToRecord<typeof foo>; // FooParamsRecord 等价于 { x: number, y: number }
通用场景说明
遗憾的是,目前TypeScript无法动态提取任意数量的函数参数名称作为类型键(类型系统不跟踪参数名称)。如果需要支持任意数量的参数,只能通过手动定义参数名与类型的映射关系来实现。
内容的提问来源于stack exchange,提问作者user29889977
相关产品推荐
相关产品推荐

