操作符

获取类型的键值 keyof

返回一个type 的所有属性组成的联合类型

  1. type Person = {
  2. name: string
  3. age: number
  4. }
  5. type properties = keyof Person // 'name'|'number'

获取变量类型 typeof

  1. const obj = {
  2. name: 'jacob',
  3. age: 23
  4. }
  5. type t = typeof obj
  6. // type t = {name: string; age: number}

遍历联合类型 in

使用in 遍历联合类型,作为对象 key 值的类型

  1. type Courses = price|time
  2. type CourseObj = {
  3. [k in Courses]:number // 遍历Courses类型作为key
  4. }

泛型

基本使用

  1. // 普通类型定义
  2. type Dog<T> = { name: string, type: T }
  3. // 普通类型使用
  4. const dog: Dog<number> = { name: 'ww', type: 20 }
  5. // 类定义
  6. class Cat<T> {
  7. private type: T;
  8. constructor(type: T) { this.type = type; }
  9. }
  10. // 类使用
  11. const cat: Cat<number> = new Cat<number>(20); // 或简写 const cat = new Cat(20)
  12. // 函数定义
  13. function swipe<T, U>(value: [T, U]): [U, T] {
  14. return [value[1], value[0]];
  15. }
  16. // 函数使用
  17. swipe<Cat<number>, Dog<number>>([cat, dog]) // 或简写 swipe([cat, dog])

推导和默认值

  1. type Dog<T> = { name: string, type: T }
  2. function adopt<T>(dog: Dog<T>) { return dog };
  3. const dog = { name: 'ww', type: 'hsq' }; // 这里按照Dog类型的定义一个type为string的对象
  4. adopt(dog); // Pass: 函数会根据入参类型推断出T为string
  5. type Dog<T = string> = { name: string, type: T }

extends进行类型约束和三元运算

  1. // 限定 T 继承 number
  2. function sum<T extends number>(value: T[]): number {
  3. let count = 0;
  4. value.forEach(v => count += v);
  5. return count;
  6. }
  7. type ExtendsType<T> = T extends boolean ? "重学前端" : "玩转Vue3"

infer 推断

使用 infer 修饰推断出的类型,一般在泛型中使用,对满足条件的泛型类型进行类型抽取

  1. // infer 实现 ReturnType
  2. type ReturnType1<T> = T extends ()=>infer P ? P:never
  3. type Foo = () => number
  4. type Foo1 = ReturnType1<Foo> // number

泛型工具

Partial

Partial<T>,将泛型T的属性都变成可选,返回的属性是 T 的子集

  1. type Person = {
  2. name: string
  3. age: number
  4. }
  5. type particalPerxon = Partial<Person>
  6. // 相当于 type particalPerxon = {name?:string; age?:number}
  7. const Jack:Partical<Person> = {name: 'Jack'}
  1. // 实现 Partial<T>
  2. type Partial<T> = {
  3. [P in keyof T]? : T[P]
  4. }

Required(与 Partial 相反)

Required<T>,将泛型 T 的所有属性都变成必须

  1. type Person = {
  2. name?: string
  3. age?: number
  4. }
  5. const Jack:Required<Person> = {
  6. name: 'Jack',
  7. age: 23
  8. }
  1. // 实现 Required<T>
  2. type Required<T> = {
  3. [P in keyof T]: T[P]
  4. }

Pick

Pick<T, a | b>,保留泛型T中的某些属性,保留的属性由第二个参数决定,可以但是单个属性,也可以是联合类型

  1. type Person = {
  2. name: string
  3. age: number
  4. location:string
  5. }
  6. const Jack:Pick<Person, 'name'|'age'> = {
  7. name: 'Jack'
  8. age:23
  9. }
  1. // 实现 Pick<T, K>
  2. type Pick<T, K extends keyof T> = { // extends 泛型约束
  3. [P in K]: T[P]
  4. }

Omit(与 Pick 相反)

Omit<T,K>,将泛型T中的K(string)属性删除,保留剩余属性

  1. type Person = {
  2. name: string
  3. age: number
  4. }
  5. const Jack:Omit<Person, 'age'> = {name: 'Jack'}
  1. // 实现 Omit<T, K>, 借助了 Exclude, Pick
  2. type Omit<T,K> = Pick<T, Exclude<keyof T, K>>

Parameters

Parameters<T>, 传入的泛型T必须是个函数类型,返回函数参数类型组成的元组

  1. type fn = (name:string, age:number) => void
  2. type params = Parameters<fn> // [string, number]
  1. // 实现 Parameters
  2. type Parameters<T> = T extends (param: infer P)=> any ? P : never

ReturnType

ReturnType<T>,传入的泛型T必须是函数类型,返回函数类型 T 返回值的类型

  1. const fn = () => {
  2. return {
  3. name: 'jack',
  4. age: 23
  5. }
  6. }
  7. // 用 typeof 获取函数fn的类型
  8. type res = ReturnType<typeof fn> // {name:string; age:number}
  1. // 实现 ReturnType<T>
  2. type ReturnType<T> = T extends ()=> infer P ? P: never

Exclude

Exclude<T, K>,其中T必须是联合类型,从T中排除K(字符串)

  1. type Person = {
  2. name: string
  3. age: number
  4. }
  5. type keys = keyof Person
  6. type age = Exclude<keys, 'name'> // age
  1. // 实现 Exclude<T, K>
  2. type Exclude<T, K> = T extends K ? never: T

Extract

Extract<T, K>,T和K 都是联合类型, 抽取两者的交集

  1. type A = number | string | boolean
  2. type B = number | boolean
  3. type Foo = Extract<A, B> // number | boolean
  1. // 实现 Extract<T, K>
  2. type Extract<T, K> = T extends K ? T :never