07 泛型函数之工具函数进阶

174 阅读1分钟

初篇

熟悉泛型函数基本开发了吗?

是的

好的开始进阶吧

进阶

Pick<ObjType, Keys> 泛型函数?

关键点通过 Keys extends keyof T 限定传入的键为 _ObjType _的键

// Pick<T, Keys>
  type Person = {
    age: number,
    name: string,
    young: boolean
  }
  type Num = Pick<Person, 'age'>
 

  type PickGeneric<Obj, Keys extends keyof Obj> = {
    [key in Keys]: Obj[key]
  }

  type AgeNameGeneric = PickGeneric<Person, 'age' | 'name'>
  
  const p1: AgeNameGeneric = {
    age: 22,
    name: 'jack'
  }

ExcludeGeneric<UnionType, ExcludedKeys> 怎么实现?

通过类型系统中泛型函数特殊的循环排除语法去做到


// 基本用法
type Num = Exclude<string | number, string>

type ExcludeGeneric<UnionType, ExcludedKeys> = UnionType extends ExcludedKeys ? never : UnionType

type Str = ExcludeGeneric<string | number, number>


从基本实现中仿佛可以不通过泛型函数去排除一个 _uniontype _中的其中一个,但实际是不行的
在泛型函数中的类型算法执行是不同的,像是一个类型算法的循环去检测符合的类型最后返回



type Union = 'age' | 'name' | 'young'

type ExcludeKey = 'age'
// 这样不通过泛型函数是实现不了排除功能的
type NumAge = Union extends ExcludeKey ? never : Union


Omit<Type, Keys> 泛型函数实现?

泛型函数中使用泛型函数
关键点

  1. Keys extends string | number | symbol 传入的值是可以用作对象的
  2. Exclude<keyof ObjType, Keys> 利用 Exclude 工具泛型函数筛选处所需要的键
type Person = {
  age: number,
  name: string,
  young: boolean
}
type AgeName = Omit<Person, 'young'>

type OmitGeneric<ObjType, Keys extends string | number | symbol> = {
  [Key in Exclude<keyof ObjType, Keys>]: ObjType[Key]
}

type AgeName2 = OmitGeneric<Person, 'young'>

Extract<Type, Union>?

type Num = Extract<string | number, number>

type ExtractGeneric<UnionType, ExcludedKeys> = UnionType extends ExcludedKeys ? UnionType : never

type Str = ExtractGeneric<string | number, string>

NonNullable?

通过从 Type 中排除 null 和 undefined 来构造一个类型。



  type T1 = NonNullable<string | number | undefined | null>

  type NoNull1<UnionType> = Exclude<UnionType, null | undefined>

  type NoNull2<UnionType> = UnionType extends null | undefined ? never : UnionType


  type T2 = NoNull1<string | number | undefined | null>

  type T3 = NoNull2<string | number | undefined | null>