我正在用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将能够正确地解析类型并理解您的意图。