需求:实现内置的Exclude <T, U>类型,但不能直接使用它本身。
type MyExclude<T, U> = any
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a'>, Exclude<'a' | 'b' | 'c', 'a'>>>,
Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a' | 'b'>, Exclude<'a' | 'b' | 'c', 'a' | 'b'>>>,
Expect<Equal<MyExclude<string | number | (() => void), Function>, Exclude<string | number | (() => void), Function>>>,
]
先用js的思路写一遍:
- 返回一个数组
- 遍历数组
- 如果arr2有与arr1相同的元素,则进行下一次循环,直到碰到arr2中没有与arr1相同的数组则push进新数组
function MyExclude(arr1,arr2){
let result=[]
for(let i=0;i<arr1.length;++i){
if(!arr2.includes( arr1[i])){
result.push( arr1[i])
}
}
return result
}
接着想想ts怎么写:
type MyExclude<T, U> =T extends U?never:T
extends关键字这里对T、U进行分布式遍历,所以T满足U的话就返回never否则就返回T