去除数组指定元素
About 1 minTC-Medium
去除数组指定元素
题目
实现一个像 Lodash.without 函数一样的泛型 Without<T, U>,它接收数组类型的 T 和数字或数组类型的 U 为参数,会返回一个去除 U 中元素的数组 T。
例如:
type Res = Without<[1, 2], 1>; // expected to be [2]
type Res1 = Without<[1, 2, 4, 1, 5], [1, 2]>; // expected to be [4, 5]
type Res2 = Without<[2, 3, 2, 3, 2, 3, 2, 3], [2, 3]>; // expected to be []
解答
这里提供了两种解法。
Solution #1
依旧是使用递归的思路.
每次检查T
中的第一个元素F
是否在U
中, 如果在, 就忽略此元素, 然后返回Without<R>
(R
是T
的剩余部分), 否则就保留此元素, 返回[F, ...Without<R>]
. 如果是空数组, 就返回空数组.
type Without<T extends readonly unknown[], U> = T extends [infer F, ...infer R]
? Includes<F, U> extends true
? [...Without<R, U>]
: [F, ...Without<R, U>]
: [];
使用的工具类型: Includes
Solution #2
从 5117 中俺们知道, 俺们可以使用联合类型+extends
来简化Includes
的实现.
type ToUnion<T> = T extends any[] ? T[number] : T;
type Without<T, U> = T extends [infer F, ...infer R]
? F extends ToUnion<U>
? Without<R, U>
: [F, ...Without<R, U>]
: T;