TS常见泛型

116 阅读2分钟

TS常见语法

原文

Partial

partial作用是将传入的属性变为可选项

首先需要理解两个关键字keyof和in,keyof可以用来取得一个对象接口的所有key值。

interface Foo {
  name: string;
  age: number
}
type T = keyof Foo // -> 'name' | 'age'

而in可以遍历枚举类型

type Kesy = 'a' | 'b'
type Obj = {
  [p in Keys]: any
} // -> { a: any, b: any }

keyof产生联合类型,in则可以遍历枚举类型,所以它们经常一起使用。

// Partial源码
type Partail<T> = { [P in keyof T]?: T[P] }

keyof T拿到T的所有属性名,然后in进行遍历,将值赋给P,最后T[P]取得对应的属性值。

Required

Required的作用是将传入的属性变为必选项

// Required 源码
type Required<T> = { [p in keyof T]-?: T[P] }

-?是将可选项?去掉,从而让类型变成必选项。与之对应的是+?,这含义与-?相反,是用来把属性变成可选项。

Mutable

对readonly进行加减

// Mutable 源码
type Mutable<T> = {
  - readonly [P in keyof T]: T[P]
}
// 将T的所有属性的readonly移除
Readonly

将传入的属性变为只读项

type Readonly<T> = { readonly [P in keyof T]: T[P]}
Record

将K中所有的属性的值转化为T类型

type Record<K extends keyof any, T> = { [P in K]: T}
Pick

从T中取出一系列K的属性

type Pick<T, K extends keyof T> = { [P in K]: T[P]}
Exclude

在ts2.8中引入了一个条件类型,

T extends U ? X : Y

上面语句的意思:如果T是U的子类型,返回X,否则返回Y

可以多个组合

type TypeName<T> = {
  T extends string ? 'string' :
  T extends number ? 'number' :
  T extends boolean ? 'boolean' :
  T extends undefined ? 'undefined' :
  T extends Function ? 'function' :
  'object'
}
// Exclude源码
type Exclude<T, U> = T extends U ? never : T
// eg
type T = Exclude<1 | 2, 1 | 3> // ->2
Extract

Extract的作用是取出T中包含U中的元素

type Extract<T, U> = T extends U ? T : never
Omit(未包含)

用之前的Pick和Exclude进行组合,实现忽略对象某些属性功能

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>
//eg
type Foo = Omit<{name: string, age: number}, 'name'> // -> { age: number }