1. 当要求自己实现类型提取时,假设要提取 Goose 中 name,age 属性会想到以下方法:
type Gooose={
name:string
age:number
getCuurent:()=>void
}
type FilterObj<T,U>={
[P in keyof T]:T[P]
}
// 此时 FIlterObj 接受遍历了 key,但我们始终不清楚 提取的 key 的类型,因此,断言它:
type Gooose={
name:string
age:number
getCuurent:()=>void
}
type FilterObj<T,U>={
[P in keyof T as Exclude<P,U>]:T[P]
}
假设我传递了 age 作为属性
const some:FilterObj<Gooose,'getCuurent'>={name:"sanm",age:99}
const some2:FilterObj=<Goose,'name'| 'age'>={
getcurrent:()=>alert("!!")
}
大功告成👩🎤
方法二#
根据值类型过滤索引
type Gooose={
name:string
age:number
getCuurent:()=>void
}
//因为never是任何类型的子类型,故此key合并时自动消失
type FilterOptions<T,U>={
[P in keyof T]:T[P] extends U? never:P
}[keyof T] //最后提取联合类型
type oo=FilterOptions<Gooose,Fucnction>
//oo返回类型为
{getCurrent:never,name:string,age:number}
//同理
type pp=FilterOptipns<Gooose,Function|age>
//返回为{age:never,getCurrent:never,name:string}
因为最终提取结果为联合类型 ‘name’ | 'age ' | 'getCurrent'
type resut =Pick<Goose,pp>
即提取了对应类型,大功告成🙂
方法三#
type Gooose={
name:string
age:number
getCuurent:()=>void
}
type Omit<T,U>=Pick<T,Exclude<keyof T,U>>
type try=Omit<Gooose,'name' | 'age'>