If you want to achieve this, you would need recursive conditional types. This feature will be fully available in version 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
Edit
A simpler version, courtesy of 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
/Edit
You can implement a workaround even now (the extra level of indirection is necessary to trick the compiler into accepting the recursive conditional type; conceptually, it is similar to the simplified version above):
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
Just for fun, here's the generalized flattening version for 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
Note: Although recursive types are more supported in 4.1, keep in mind that you may still encounter hardcoded limits in the compiler, such as type instantiation depth and total type instances. Recursive types tend to generate a large number of type instantiations, so use them judiciously.