网站搜索

Typescript - 连接参数元组的联合


我有一个参数的联合:

type Params = [{ name: string }] | [{ x: number, y: number } | ...];

我想要连接联合中的每个元组(不论联合中有多少个元组),并得到如下结果:

type ParamsJoined = [{ name: string, x: number, y: number, ... }];

我不能使用像 const 这样的技巧,因为类型 Params 是使用 Parameters 和对函数联合的分配条件类型动态创建的。

我该怎么做?

答案#1

好吧,你需要三样东西来实现:

  1. 从数组类型中提取基础类型。
  2. 拆分联合类型
  3. 并将拆分的类型合并为一个。

第一个是一个简单的例子,包括映射类型和 infer 关键字:

type UnderlyingType<T> = T extends Array<infer R> ? R : T;

对于第二个,你必须参考这个问题。

第三个有点高级,你应该参考这个问题。

最后,你会得到如下内容:

type U1 = UnderlyingType<Params>

type SplitTyped = SplitType<U1>

type FinalType = Spread<SplitTyped[0],SplitTyped[1]>

游乐场链接

编辑:对于未知数量的类型参数(其数量有限制),你可以利用 SpreadTuple 类型映射来实现

type SpreadTuple<T extends any[], L extends number = T['length']> = L extends 0 ? never 
: L extends 1 ? T[0] 
: L extends 2 ? Spread<T[0], T[1]> 
: L extends 3 ? Spread<T[0], Spread<T[1], T[2]>> 
: L extends 4 ? Spread<T[0], Spread<T[1],Spread<T[2],T[3]>>> 
: never; // continiue to somewhere

然后你可以根据需要使用它:

type FinalType = SpreadTuple<SplitTyped>

游乐场链接