Typescript - 连接参数元组的联合
我有一个参数的联合:
type Params = [{ name: string }] | [{ x: number, y: number } | ...];
我想要连接联合中的每个元组(不论联合中有多少个元组),并得到如下结果:
type ParamsJoined = [{ name: string, x: number, y: number, ... }];
我不能使用像 const 这样的技巧,因为类型 Params 是使用 Parameters 和对函数联合的分配条件类型动态创建的。
我该怎么做?
答案#1
好吧,你需要三样东西来实现:
- 从数组类型中提取基础类型。
- 拆分联合类型
- 并将拆分的类型合并为一个。
第一个是一个简单的例子,包括映射类型和 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>
游乐场链接
