题目来源(type-challenges)
问题
type case1 = FilterOut<[], never> // []
type case2 = FilterOut<[never], never> // []
type case3 = FilterOut<['a', never], never> // ['a']
type case4 = FilterOut<[1, never, 'a'], never> // [1, 'a']
type case5 = FilterOut<[never, 1, 'a', undefined, false, null], never | null | undefined> // [1, 'a', false]
type case6 = FilterOut<[number | null | undefined, never], never | null | undefined> // [number | null | undefined]
解答
type FilterOut<T extends any[], U> =
T extends [infer F, ...infer R]
? [F] extends [U]
? [...FilterOut<R, U>]
: [F, ...FilterOut<R, U>]
: []
拆分
- 先拆分数组,然后用递归的方式拆分每一个元素
- 因为
U
可能是联合类型需要用 [U]
来分发每一个联合类型的元素 - 因为分发后是一个元组,所以对应的拆分的元素也要是一个元组才能对比