数组扁平化
题目
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'>