# 再战 TypeScript
本文是根据冴羽博客 (opens new window)整理出来的学习记录。
# TypeScript 的工具类型
# Partial<Type>
用于构造一个Type
下面所有属性都是可选的类型。
type Partial<T> = {
[P in keyof T]?: T[P];
};
1
2
3
2
3
# Required<Type>
顾名思义,与Partial
相反。
type Required<T> = {
[P in keyof T]-?: T[P];
};
1
2
3
2
3
# Readonly<T>
用于构造一个Type
下面所有属性都是只读类型的类型。
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
1
2
3
2
3
# Record<Keys, Type>
用于构造一个对象类型,其所有的键值都是Keys
,所有 value 都是Type
,即将 keys 映射到了 Type 身上
type Record<Keys extends string | symbol | number, Type> = {
[K in Keys]: Type;
};
interface Person {
name: string;
age: number;
}
type Class = Record<"teacher" | "student", Person>;
/*
type Class = {
teacher: Person;
student: Person;
}
*/
type Class = Record<string, Person>;
/* type Class = {
[x: string]: Person;
} */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Pick<Type, Keys>
用于从一个对象类型中去挑出一些属性Keys
(这里一定要是字符串字面量或者联合类型,原因看下面代码就知道了)
type Pick<Type, Keys extends keyof Type> = {
[K in Keys]: Type[Keys];
};
1
2
3
2
3
# Omit<Type,Keys>
与Pick
相反,表示过滤掉一些属性Keys
type Omit<Type, Keys extends string | number | symbol> = {
[K in Exclude<keyof Type, Keys>]: Type[K];
};
1
2
3
2
3
以上介绍的所有工具类都是返回一个对象类型,以下的工具类型则是会返回任何类型~~,即作为更为泛用基础的工具类型
# Exclude<T,U>
和 Extract<T,U>
type Exclude<T, U> = T extends U ? never : T;
type Extract<T, U> = T extends U ? T : never;
1
2
3
2
3
# NonNullable<T>
顾名思义,去掉类型中所有null
、undefined
的类型
type NonNullable<T> = T extends null | undefined ? never : T;
1
# Parameters<Type>
用于根据传入的Type
函数类型,构造出其参数的元组类型。
type Parameters<T extends (...args: any[]) => any> = T extends (
...args: infer K
) => any
? K
: // 这里直接K,因为infer推断出的就是元组类型
never;
1
2
3
4
5
6
2
3
4
5
6
# ReturnType<T>
用于根据传入的函数类型,返回其返回值类型。这个也非常常用
type ReturnType<T extends (...args: any[]) => any> = T extends (
...args: any[]
) => infer R
? R
: never;
1
2
3
4
5
2
3
4
5