为此,您需要递归条件类型。这将在 4.1 中得到完全支持:
type Example = [[3,5,7], [4,9], [0,1,10,9]];
type Flatten<T extends any[]> =
T extends [infer U, ...infer R] ? U extends any[] ? [...U, ... Flatten<R>]: []: []
type FlatExample = Flatten<Example>;
Playground Link
编辑
更简单的版本,jcalz 的屈尊:
type Example = [[3,5,7], [4,9], [0,1,10,9]];
type Flatten<T extends any[]> =
T extends [any, ...infer R] ? [...T[0], ... Flatten<R>]: []
type FlatExample = Flatten<Example>;
Playground Link
/编辑
即使在今天你也可以破解一个版本(需要额外的间接来欺骗编译器以允许递归条件类型,从概念上讲这相当于上面更简单的版本):
type Example = [[3, 5, 7], [4, 9], [0, 1, 10, 9]];
type Flatten<T extends any[]> = T extends [infer U, ...infer R] ? {
1: U extends any[] ? [...U, ...Flatten<R>] : [],
2: []
}[U extends any[] ? 1 : 2] : [];
type FlatExample = Flatten<Example>;
Playground Link
只是为了好玩,4.1,通用扁平化版本。
type Example = [[3,5,7], [4,9, [10, 12, [10, 12]]], [0,1,10,9, [10, 12]]];
type Flatten<T extends any[]> =
T extends [infer U, ...infer R] ?
U extends any[] ?
[...Flatten<U>, ... Flatten<R>]: [U, ... Flatten<R>]: []
type FlatExample = Flatten<Example>;
Playground Link
注意:虽然递归类型在 4.1 中得到更多支持,但您仍然会遇到编译器硬编码的限制,例如类型实例化深度和类型实例总数(因为递归类型会生成大量类型实例化)。所以请谨慎使用。