【笔记】TS的泛型

前言

TS的泛型学习笔记

函数

定义函数时指定泛型类型

1
2
3
function 函数名<泛型类型>() {
...
}
1
2
3
function 函数名<泛型类型1, 泛型类型2>() {
...
}
1
2
3
function 函数名<泛型类型 = 默认数据类型>() {
...
}

调用函数时指定泛型类型

1
函数名<泛型类型>();

泛型自动类型推导

1
2
3
4
5
function 函数名<泛型类型>(形参名: 泛型类型) {
...
}

函数名(实参);

定义类时指定泛型类型

1
2
3
class 类名<泛型类型> {
...
}
1
2
3
class 类名<泛型类型1, 泛型类型2> {
...
}
1
2
3
class 类名<泛型类型 = 默认数据类型> {
...
}

创建对象时指定泛型类型

1
let 变量名 = new 类名<泛型类型>();

泛型自动类型推导

1
2
3
4
5
6
7
8
9
class 类名<泛型类型> {
private _属性名: 数据类型;

constructor(属性名: 泛型类型) {
this._属性名 = 属性名;
}
}

let 变量名 = new 类名(实参);

接口

定义接口时指定泛型类型

1
2
3
interface 接口名<泛型类型> {
...
}
1
2
3
interface 接口名<泛型类型1, 泛型类型2> {
...
}
1
2
3
interface 接口名<泛型类型 = 默认数据类型> {
...
}

使用接口时指定泛型类型

1
let 变量名: 接口名<泛型类型>;

泛型约束

约束泛型类型的数据结构

1
2
3
4
5
6
7
interface 接口名 {
...
}

function 函数名<泛型类型 extends 接口名>() {
...
}

约束泛型类型为对象所有属性的联合类型

1
2
3
4
5
6
7
8
interface 接口名 {
属性名1: 数据类型;
属性名2: 数据类型;
}

function 函数名<泛型类型 extends keyof 接口名>() {
...
}

约束泛型类型为能作为对象属性的联合类型

  • 约束泛型类型为能作为对象属性的联合类型(string | number | symbol
1
2
3
function 函数名<泛型类型 extends keyof any>() {
...
}

内置工具

获取函数返回值类型

1
2
3
type 函数类型 = () => any;

type 函数返回值类型 = ReturnType<函数类型>
1
2
3
function 函数名() {}

type 函数返回值类型 = ReturnType<typeof 函数名>

所有属性全部为可选

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
2
3
class 类名 {}

type 新类型 = InstanceType<typeof 类名>;

条件类型

通过泛型提取返函数返回值类型

1
type 函数返回值类型<泛型类型> = () => infer R ? R : never;

通过泛型提取形参类型

1
type 函数形参类型 = (...args: infer A) => any;

类型分发

  • 如果泛型参数传递的是联合类型,则实际会进行类型分发

完成