0%

typescript学习

高级泛型

1.Partial 此工具的作用是将泛型中的全部属性变成可选的

定义:
1
2
3
4
type Partial<T> = {
[P in keyof T]?: T[p]
}
//T是传入的泛型 P是泛型T中的属性名,T[P]则可获取到泛型T中属性名为P的属性值
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
例子:
interface IUser {
name: string
age: number
department: string
}
type optional = Partial<IUser>

// optional的结果如下
type optional = {
name?: string | undefined;
age?: number | undefined;
department?: string | undefined;
}

2. Pick<T,K>此工具的作用是将泛型T中的属性名为K的属性提取出来

定义:
1
2
3
4
type Pick<T, K extends keyof T> = {
[P in K]: T[P]
}
//K是泛型T的键名集合,P和K都是键名,P是K的一个子集
举例:
1
2
3
4
5
6
7
8
9
10
11
12
interface IUser {
name: string
age: number
department: string
}
type option = Pick<TUser, 'name'|'age'>

// optional的结果如下
type optional = {
name: string
age: number
}

3.Readonly< T >,此工具的作用是将T泛型中的所有属性都变成只读类型(即不可以对属性重新赋值)

定义:
1
2
3
type Readonly<T> = {
readonly [P in keyof T]: T[P]
}
举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
interface IUser {
name: string
age: number
department: string
}
type option = Readonly<TUser>

// optional的结果如下
type optional = {
readonly name: string
readonly age: number
readonly department: string
}

4. Exclude <T, U>此工具的作用是在T类型中有U类型就去掉

定义:
1
2
3
4
5
type Exclude<T, U> = T extends U? never: T

我们这里用 MyTypes 也就是 ‘name’ | ‘age’ | ‘height’ 去代表 T
用 name 属性去代表第二个泛型 U
T extends U 就判断是否’name’ | ‘age’ | ‘height’ 有 name, 有name就返回never,就代表将其排除
举例:
1
2
3
4
5
MyTypes = ‘name’ | ‘age’ | ‘height’
type optionl = Exclude<MyTypes,'height'>

// optional的结果如下
type optional = ‘name’ | ‘age’
###增加小知识###

extends 可以用作继承,也可以用作条件类型,或者类型约束,具体取决于使用场景。

interfaceclass 上时,表示继承

1
2
3
class Dog extends Animal{}
// interface
interface Dog extends Animal{}

在泛型中,可以用作类型约束,如下:

1
2
3
4
/ 这里约束 arg 必须有 length 属性
function log<T extends {length: number}>(arg: T):void{
console.log(arg.length)
}

5.ReturnType< T> 获取泛型T的返回值类型

定义:
1
2
3
4
5
6
type ReturnType<T extends (...arg: any) => any> = T extends (
...arg: any
) => infer U
? U
: never;
//infer表示U是一个不确定的值
举例:
1
2
3
4
5
6
7
8
const fn = (v: boolean) => {
if (v) {
return 1;
} else {
return 2;
}
};
type a = MyReturnType<typeof fn>; //type a = 1 | 2

6. Parameters获取函数参数的类型

定义:
1
2
3
4
5
type Parameters<T extends (...args: any[]) => any> = T extends (
...args: infer P
) => any
? P
: never;
举例:
1
2
3
4
5
function getUser(name: "string") {
return { name: "xxx", age: 10 };
}
type a = Parameters<typeof getUser>;
//type a = [name: "string"]
7.Omit<T, K> 省略泛型T中属性名为K的属性
定义:
1
2
3
type Omit<T, K extends string | number | symbol> = {
[P in Exclude<keyof T, K>]: T[P];
};
举例:
1
2
3
4
5
6
7
8
9
10
interface Todo {
title: string;
description: string;
completed: boolean;
}

type TodoPreview = Omit<Todo, "description" | "title">;
//type TodoPreview = {
completed: boolean;
}