我正在用TS处理一些JS算法。
所以我做了这个功能:

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

但是这些论点需要灵活地接受多维数组,如下:
steamrollArray([[["a"]], [["b"]]]);
steamrollArray([1, [2], [3, [[4]]]]);
steamrollArray([1, [], [3, [[4]]]]);
steamrollArray([1, {}, [3, [[4]]]]);

定义函数参数的正确方法是什么?
当然,我可以使用类型,比如这里:typescript multidimensional array with different types但不适用于所有案例。

最佳答案

您需要定义一个可能是数组但可能不是数组的类型。类似于:

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

然后您可以将函数更新为:
function steamrollArray<T>(arr: MaybeArray<T>[]): T[] {
    return arr.reduce(
        (accum: any, val: any) =>
             Array.isArray(val) ? accum.concat(steamrollArray(val)) : accum.concat(val)
    , []);
}

这样,typescript将能够正确地解析类型并理解您的意图。

10-05 17:58