459 - Flatten
在这个挑战中,你需要写一个接受数组的类型,并且返回扁平化的数组类型。
例如:
type flatten = Flatten<[1, 2, [3, 4], [[[5]]]]> // [1, 2, 3, 4, 5]
Solution
type Flatten<T extends unknown[]> = T extends [infer First, ...infer Rest]
? First extends unknown[]
? [...Flatten<First>, ...Flatten<Rest>]
: [First, ...Flatten<Rest>]
: []
infer First 获取类型数组第一个元素,紧接着判断其是否是数组 First extends unknown[]
- 是, 则分别继续递归
First和 剩余的数组元素Rest, 需要注意的是Flatten<First>前需要加拓展运算符,Flatten返回的是一个数组, 加拓展运算符用以展开数组元素 - 不是, 则说明
First已是最中的元素, 只需要剩余的数组元素Rest即可
假设 T = [1, [2]]
第一层:
经过 T extends [infer First, ...infer Rest], 运算后得到 First=1, Rest=[[2]]
接着判断 First 是否是数组, 不是则返回 [1, ...Flatten<[[2]]>]
第二层:
递归运算 Flatten<[[2]]> 时 T=[[2]], 经过 T extends [infer First, ...infer Rest], 运算后得到 First=[2], Rest=[]
判断 First 是否是数组, 是数组,返回 [...Flatten<[2]>, ...Flatten<[]>]
第三层:
递归运算 Flatten<[2]> 时 T=[2], 经过 T extends [infer First, ...infer Rest], 运算后得到 First=2, Rest=[]
判断 First 是否是数组, 不是返回 [2, ...Flatten<[]>]
因为Flatten<[]> 返回 [], 所以:
第三层计算出
Flatten<[2]> = [2, ...Flatten<[]>] = [2]第二层计算出
Flatten<[[2]]> = [...Flatten<[2]>, ...Flatten<[]>] = [...[2]] = [2]第一层计算出
Flatten<[1, [2]]> = [1, ...Flatten<[[2]]>] = [1, ...[2]] = [1, 2]