泛型
TypeScript泛型介绍
介绍官网说的很详细了,其实泛型就是 对类型进行 编程的东西,一点也不复杂,会写代码函数的都很好理解。
想学好泛型,只需要掌握两点基础知识即可:
- keyof 获取使用
- in 遍历使用
哦,还有一个 泛型约束,关键语法 extends
基础知识介绍
先定义一个 接口 interface如下:
interface IUser {
id: number;
name: string;
age?: number;
info?: string;
}
接下来 介绍 keyof 的使用,先用keyof 获取接口IUser的所有属性,如下:
type IUserKeys = keyof IUser;
然后 介绍 in 的使用,用来遍历属性,如下:
type IKeys = {
[P in keyof IUser]: IUser[P]
}
简单吧,就像写 最简单的程序一样,好,接下来进入正题,我们分析一下 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>>;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。