泛型

TypeScript泛型介绍
介绍官网说的很详细了,其实泛型就是 对类型进行 编程的东西,一点也不复杂,会写代码函数的都很好理解。
想学好泛型,只需要掌握两点基础知识即可:

  1. keyof 获取使用
  2. in 遍历使用
    哦,还有一个 泛型约束,关键语法 extends

基础知识介绍

先定义一个 接口 interface如下:

interface IUser {
    id: number;
    name: string;
    age?: number;
    info?: string;
}

接下来 介绍 keyof 的使用,先用keyof 获取接口IUser的所有属性,如下:

type IUserKeys = keyof IUser;

image.png

然后 介绍 in 的使用,用来遍历属性,如下:

type IKeys = {
    [P in keyof IUser]: IUser[P]
}

image.png

简单吧,就像写 最简单的程序一样,好,接下来进入正题,我们分析一下 typescript内置的几种常用类型工具。

预置类型

  • Partial<T>
    就是把 一个接口的属性都变成 可选的,利用上面的 keyof 和 in加上 可选操作符直接实现就行,如下:

    type Partial<T> = {
      [P in keyof T]?: T[P];
    };
  • Required<T>
    所有属性设置成 必填的,和上面同理,去掉可选操作符即可:

    type Required<T> = {
      [P in keyof T]-?: T[P];
    };
  • Readonly<T>
    把属性设置成 只读,同理,添加readonly修饰符即可:

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

    上面这三个都很简单,很好理解吧?接下来实现一些稍微复杂的,当然也不难

  • Pick<T, K>
    含义就是,选取接口中的 部门类型。这里有个 关键点就是 这部分 必须 在接口中存在,所以需要 加上 泛型约束,实现就是 利用 extends 关键词,表示 K 被 (keyof T)约束,如下:

    type Pick<T, K extends keyof T> = {
      [P in K]: T[P];
    };
  • Record<K, T>
    含义就是把 属性K 的类型设置成 T 类型,遍历 K,设置为 T 即可。

    type Record<K extends keyof any, T> = {
      [P in K]: T;
    };
  • Exclude<T, U>
    含义就是 从T中剔除不想要的U部分,比如 'a' | 'b' | 'c',剔除'c':

    type Exclude<T, U> = T extends U ? never : T;
  • Qmit<T, K>
    构造一个T类型接口,但是要从中排除 K 中的属性。这个需要思考一下,直接说实现思路 就是利用Pick挑选想要的属性,然后 想要的属性 通用 Exclude 把 K中的来排除掉来获取。

    type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

donglegend
910 声望82 粉丝

长安的风何时才能吹到边梁?