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
相关产品推荐
相关产品推荐

