Skip to main content

5117 - Without

Answer TestCases

实现一个像 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

type Without<T extends unknown[], U extends unknown[] | number> = T extends [
infer F,
...infer R
]
? F extends Exclude<T[number], U extends unknown[] ? U[number] : U>
? [F, ...Without<R, U>]
: Without<R, U>
: T

通过将 T extends [infer F, ...infer R] 将泛型 T 分为两部分

  • 首元素类型 F
  • 剩余元素构成的数组类型 R

T[number] 返回数组 T 中元素构成的联合类型,并且会去重,如数组[1, 1, 2, 4, 8], T[number] = 1 | 2 | 4 | 8

Exclude<T[number], U extends unknown[] ? U[number] : U> : 排除 T[number] 中包含的 U[number], 是最终结果去重后的

如果 F 属于排除后的结果,则说明 F 是包含在最终结果中,之后继续遍历 R 即可.