Для этого вам потребуются рекурсивные условные типы. Это будет полностью поддерживаться в 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>;
площадка 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>;
площадка 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>;
площадка 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>;
площадка Link
Примечание. Хотя рекурсивные типы больше поддерживаются в версии 4.1, вы по-прежнему можете столкнуться с жестко запрограммированными ограничениями компилятора, такими как глубина создания экземпляров типов и общее количество экземпляров типов (поскольку такие рекурсивные типы генерируют множество экземпляров типов). Так что используйте экономно.
person
Titian Cernicova-Dragomir
schedule
24.08.2020