TypeScript: Mod corect pentru argumentul unui array multidimensional


Lucrez la niște algoritmi JS cu TS. Așa că am făcut aceste funcții:

function steamrollArray(arr: any[]): any[] {
  return arr.reduce(
    (accum: any, val: any) =>
      Array.isArray(val) ? accum.concat(steamrollArray(val)) : accum.concat(val)
  , []);
}

dar argumentele au nevoie de flexibilitatea de a accepta array-uri cu mai multe dimensiuni, după cum urmează:

steamrollArray([[["a"]], [["b"]]]);
steamrollArray([1, [2], [3, [[4]]]]);
steamrollArray([1, [], [3, [[4]]]]);
steamrollArray([1, {}, [3, [[4]]]]);

Care este modul corect de a defini argumentele pentru funcție?

Cu siguranță aș putea folosi tipuri, ca aici: arrays multidimensionale TypeScript cu tipuri diferite, dar nu va funcționa în toate cazurile.

Răspuns #1

Vei dori să definești un tip care este posibil un array și posibil nu. Ceva de genul:

type MaybeArray<T> = T | T[];

Atunci poți să-ți actualizezi funcția la:

function steamrollArray<T>(arr: MaybeArray<T>[]): T[] {
    return arr.reduce(
        (accum: any, val: any) =>
             Array.isArray(val) ? accum.concat(steamrollArray(val)) : accum.concat(val)
    , []);
}

Cu asta, Typescript va putea să analizeze corect tipurile și să înțeleagă intenția ta.