实现 Exclude
题目
Github: Exclude
实现内置的Exclude <T, U>
类型,但不能直接使用它本身。
从联合类型T中排除U的类型成员,来构造一个新的类型。
type Result = MyExclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'
解题思路
在 typescript 中, 条件类型是 可分配的。
在 T extends U
且 T
是联合类型时,实际上发生的是 typescript 遍历联合类型 T
中的每一个元素,并将条件判断应用到每一个元素上。
所以可以通过这一特性,检查 T
的元素是否满足 U
的约束,如果是,则跳过。
答案
type MyExclude<T, U> = T extends U ? never : T
验证
type Result = MyExclude<'a' | 'b' | 'c', 'a'>
type test = Expect<Equal<Result, 'b' | 'c'>>