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

TypeScript中可变参数的可变泛型参数顺序指定方案问询

如何实现按指定键顺序生成对应参数类型的泛型函数类型

我想实现一个泛型函数类型,要求当使用Generic<SomeObject, ['keys', 'in', 'that', 'object']>这样的形式时,生成的函数参数类型严格按照数组中键的顺序,对应SomeObject里各键的类型,最终得到的函数类型应该是:

(arg0: SomeObject['keys'], arg1: SomeObject['in'], arg2: SomeObject['that'], arg3: SomeObject['object']) => void

目前我有两个接近但不满足需求的方案:

  • 方案1:能保留参数顺序,但需要手动冗长地指定参数类型数组,实用性极差;
  • 方案2:通过键数组定义,但会把所有参数转为对应类型的联合类型,不符合按顺序匹配的要求。

想问下有没有办法实现按键数组的顺序访问对象类型,生成对应顺序的参数列表?


可以通过TypeScript的元组映射特性来实现这个需求,核心是利用泛型对键数组进行遍历,逐个映射到对象的对应类型,最终生成顺序严格一致的参数元组。

具体实现代码如下:

// 定义泛型类型,将键数组映射为对应的参数类型元组
type TupleMap<Obj extends Record<string, any>, Keys extends Array<keyof Obj>> = {
  [K in keyof Keys]: Obj[Keys[K]]
};

// 最终的泛型函数类型
type Generic<Obj extends Record<string, any>, Keys extends Array<keyof Obj>> = 
  (...args: TupleMap<Obj, Keys>) => void;

// 测试用例
type SomeObject = {
  keys: string;
  in: number;
  that: boolean;
  object: { id: number };
};

// 生成的函数类型:(arg0: string, arg1: number, arg2: boolean, arg3: { id: number; }) => void
type TestFunction = Generic<SomeObject, ['keys', 'in', 'that', 'object']>;

关键说明:

  • TupleMap类型通过遍历键数组Keys的每个索引K,取出Keys[K]对应的对象键,再获取Obj[Keys[K]]的类型,最终形成顺序完全匹配的参数元组;
  • Generic类型接收对象类型Obj和键数组Keys,将TupleMap生成的元组作为函数的剩余参数类型,从而得到符合要求的函数类型;
  • 测试用例中TestFunction的参数类型严格按照['keys', 'in', 'that', 'object']的顺序对应SomeObject的各键类型,完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:50:23