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

如何将TypeScript中Parameters<T>返回的参数类型数组转为对象类型?

问题描述

TypeScript 的工具类型 Parameters<T> 会返回函数的参数类型元组,示例如下:

const f = (a: number, b: boolean) => { 
  //...
}

// 类型为 [a: number, b: boolean]
type FParams = Parameters<typeof f>;

我需要把这种具名参数元组类型转换为对应的对象类型,即实现如下转换:

[a: number, b: boolean] -> { a: number, b: boolean }

尝试过一些已有的类型转换方案,但均不适用当前需求。

解决方案

可以结合 TypeScript 的元组标签提取、映射类型与条件类型实现该转换,以下是具体的类型工具实现:

type ParamsToObject<T extends readonly unknown[]> = {
  [K in keyof T as T[K] extends infer U ? (U extends { [key: string]: any } ? never : K) : K]: T[K]
} extends infer O ? { [K in keyof O as O[K] extends undefined ? never : K]: O[K] } : never;

实现原理

  1. 元组标签提取:具名元组的类型键包含数字索引与参数名称字符串键,比如[a: number, b: boolean]的keyof结果为 "0" | "1" | "a" | "b"。
  2. 过滤无效键:通过条件类型过滤掉数字索引键,仅保留参数名称的字符串键,同时排除可选参数带来的undefined值干扰。
  3. 映射生成对象:将保留的参数名称作为对象属性名,对应元组中的类型作为属性值,最终生成目标对象类型。

验证示例

const f = (a: number, b: boolean) => { /*...*/ };
type FParams = Parameters<typeof f>;
// 类型为 { a: number; b: boolean }
type FParamsObj = ParamsToObject<FParams>;

// 带可选参数的场景
const g = (x: string, y?: number) => { /*...*/ };
type GParamsObj = ParamsToObject<Parameters<typeof g>>;
// 类型为 { x: string; y?: number | undefined }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:06:29