Flatten
挑战
在这个挑战中,你需要编写一个接受数组并返回展平数组类型的泛型函数, 例如:
type flatten = Flatten<[1, 2, [3, 4], [[[5]]]> // [1, 2, 3, 4, 5]
解答
该挑战的基本用例是一个空数组的情况。当我们输入一个空数组时,我们返回一个空数组,
反正它已经被展平了。否则,返回T
本身:
type Flatten<T> = T extends [] ? [] : T;
但是,如果 T
不是一个空数组,这意味着我们有一个包含元素的数组或元素本身。当它
是一个包含元素的数组时,我们需要做什么?我们需要从它和尾部推断出其中一项。现在,
我们可以只返回推断的项:
type Flatten<T> = T extends []
? []
: T extends [infer H, ...infer T]
? [H, T]
: [T];
顺便说一句,请注意T
不是带有元素的数组的情况。这意味着它根本不是一个数组,因此
我们将其视为元素本身并包裹在一个数组中返回。
知道了我们数组的头部和尾部,我们可以一次又一次地递归调用Flatten
并将这些推断出
的项作为参数传过去。这样,我们将每一项展平,直到它不是数组并返回[T]
该项本身:
type Flatten<T> = T extends []
? []
: T extends [infer H, ...infer T]
? [...Flatten<H>, ...Flatten<T>]
: [T];
评论