banner
SlhwSR

SlhwSR

热爱技术的一名全栈开发者
github
bilibili

ts斷言奇技淫巧

  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'>
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。