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'>
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。