Here's a generic solution:
function flatten<T>(arr: T[][]): T[] {
return ([] as T[]).concat(...arr);
}
And a deep/recursive extension:
type NestedArray<T> = Array<NestedArray<T> | T>;
function flattenDeep<T>(input: NestedArray<T>): T[] {
return flatten(input.map(x => Array.isArray(x) ? flattenDeep(x) : [x]));
};
This answer may be more efficient for a deep flatten, I just had fun trying to write something that felt more elegant to me.