9

Say I have an array of strings like:

const a = ['foo', ['aa'], [['zzz',['bar']]]];
    
export const acceptsArray = (v: Array<any>) : string => {
   returns flattenDeep(v).join(' ');
};

besides using Array<any> how can I represent a nested array of strings?

creimers
  • 4,975
  • 4
  • 33
  • 55
Alexander Mills
  • 90,741
  • 139
  • 482
  • 817

2 Answers2

13

SOLUTION

Note only works on Typescript version 3.7+

type A = 'foo' | 'aa' | 'zzz' | 'bar' | A[]

const a:A = ['foo', ['aa'], [['zzz',['bar']]]];

export const acceptsArray = (v: Array<A>) : string => {
   returns flattenDeep(v).join(' ');
};

Thank you

Flavio Vilante
  • 5,131
  • 1
  • 11
  • 15
6

Please check this utility function I wrote earlier.

// NestedArray<T> represents T or Array of T or Array of Array of T .....
// let nestedNumbers: NestedArray<number> = [[[[[1]]]]];
export type NestedArray<T> = Array<T> | Array<NestedArray<T>>;

// Able to flatten deeply nested array
// flattenArray(nestedNumbers) should produce => [1] : Array<number>
export const flattenArray = <T>(arr: NestedArray<T>): Array<T> => {
  if (!Array.isArray(arr)) return arr ? [arr] : [];

  return arr.reduce<Array<T>>((acc: Array<T>, item: NestedArray<T>) => {
    if (Array.isArray(item)) {
      return [...acc, ...flattenArray(item)];
    }
    return [...acc, item];
  }, []);
}
Alexander Mills
  • 90,741
  • 139
  • 482
  • 817
Mikail Çolak
  • 74
  • 2
  • 3
  • 2
    if it's always an array, seems like this would be more accurate? `export type NestedArray = Array | Array>;`, since T itself doesn't have to be an array here. – Alexander Mills Dec 17 '21 at 04:30