Skip to content

数组扁平化

约 444 字大约 1 分钟

2022-12-01

题目

Github: Flatten

在这个挑战中,你需要写一个接受数组的类型,并且返回扁平化的数组类型。

type flatten = Flatten<[1, 2, [3, 4], [[[5]]]]> // [1, 2, 3, 4, 5]

解题思路

首先挑战限制了只能接受数组,因此我们需要使用条件类型限制泛型参数 T

type Flatten<T extends unknown[]> = any

由于我们不知道数组的每个成员是数组类型还是其他类型,所以我们需要依次对数组的每个成员进行判断。 这需要使用条件类型类型推断,获取数组的成员。

type Flatten<T extends unknown[]> = T extends [infer L, ...infer R] ? L : T

在获取到第一个成员 L 后,我们需要判断它是否是数组类型,以检查它是否需要继续扁平化。 并对剩余成员进行递归处理,直到没有成员需要继续扁平化。

答案

type Flatten<T extends unknown[]> = T extends [infer L, ...infer R]
  ? L extends unknown[]
    ? [...Flatten<L>, ...Flatten<R>]
    : [L, ...Flatten<R>]
  : T

验证

type 
cases
= [
Expect
<
Equal
<
Flatten
<[]>, []>>,
Expect
<
Equal
<
Flatten
<[1, 2, 3, 4]>, [1, 2, 3, 4]>>,
Expect
<
Equal
<
Flatten
<[1, [2]]>, [1, 2]>>,
Expect
<
Equal
<
Flatten
<[1, 2, [3, 4], [[[5]]]]>, [1, 2, 3, 4, 5]>>,
Expect
<
Equal
<
Flatten
<[{
foo
: 'bar', 2: 10 }, 'foobar']>, [{
foo
: 'bar', 2: 10 }, 'foobar']>>,
] // @ts-expect-error ignore type
error
=
Flatten
<'1'>

参考