- 當要求自己實現類型提取時,假設要提取 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'>