【笔记】TS的泛型
前言
TS的泛型学习笔记
函数
定义函数时指定泛型类型
1 | function 函数名<泛型类型>() { |
1 | function 函数名<泛型类型1, 泛型类型2>() { |
1 | function 函数名<泛型类型 = 默认数据类型>() { |
调用函数时指定泛型类型
1 | 函数名<泛型类型>(); |
泛型自动类型推导
1 | function 函数名<泛型类型>(形参名: 泛型类型) { |
类
定义类时指定泛型类型
1 | class 类名<泛型类型> { |
1 | class 类名<泛型类型1, 泛型类型2> { |
1 | class 类名<泛型类型 = 默认数据类型> { |
创建对象时指定泛型类型
1 | let 变量名 = new 类名<泛型类型>(); |
泛型自动类型推导
1 | class 类名<泛型类型> { |
接口
定义接口时指定泛型类型
1 | interface 接口名<泛型类型> { |
1 | interface 接口名<泛型类型1, 泛型类型2> { |
1 | interface 接口名<泛型类型 = 默认数据类型> { |
使用接口时指定泛型类型
1 | let 变量名: 接口名<泛型类型>; |
泛型约束
约束泛型类型的数据结构
1 | interface 接口名 { |
约束泛型类型为对象所有属性的联合类型
1 | interface 接口名 { |
约束泛型类型为能作为对象属性的联合类型
- 约束泛型类型为能作为对象属性的联合类型(
string | number | symbol)
1 | function 函数名<泛型类型 extends keyof any>() { |
内置工具
获取函数返回值类型
1 | type 函数类型 = () => any; |
1 | function 函数名() {} |
所有属性全部为可选
1 | type 新类型 = Partial<数据类型>; |
所有属性全部为必选
1 | type 新类型 = Required<数据类型>; |
所有属性全部为只读
1 | type 新类型 = Readonly<数据类型>; |
映射类型
1 | type 新类型 = Record<K, V>; |
选择类型
1 | type 新类型 = Pick<K, "key1" | "key2">; |
过滤类型
1 | type 新类型 = Omit<K, "key1" | "key2">; |
提取类型
1 | type 新类型 = Extract<K, "key1" | "key2">; |
非空类型
1 | type 新类型 = NonNullable<数据类型>; |
实例类型
1 | class 类名 {} |
条件类型
通过泛型提取返函数返回值类型
1 | type 函数返回值类型<泛型类型> = () => infer R ? R : never; |
通过泛型提取形参类型
1 | type 函数形参类型 = (...args: infer A) => any; |
类型分发
- 如果泛型参数传递的是联合类型,则实际会进行类型分发