再战typescript(进阶拓展)----三

6/10/2022 TypeScript 6/10/2022

# 再战 TypeScript

本文是根据冴羽博客 (opens new window)整理出来的学习记录。

# TypeScript 的工具类型

# Partial<Type>

用于构造一个Type下面所有属性都是可选的类型。

type Partial<T> = {
  [P in keyof T]?: T[P];
};
1
2
3

# Required<Type>

顾名思义,与Partial相反。

type Required<T> = {
  [P in keyof T]-?: T[P];
};
1
2
3

# Readonly<T>

用于构造一个Type下面所有属性都是只读类型的类型。

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};
1
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

# Pick<Type, Keys>

用于从一个对象类型中去挑出一些属性Keys(这里一定要是字符串字面量或者联合类型,原因看下面代码就知道了)

type Pick<Type, Keys extends keyof Type> = {
  [K in Keys]: Type[Keys];
};
1
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

以上介绍的所有工具类都是返回一个对象类型,以下的工具类型则是会返回任何类型~~,即作为更为泛用基础的工具类型

# 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

# NonNullable<T>

顾名思义,去掉类型中所有nullundefined的类型

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

# ReturnType<T>

用于根据传入的函数类型,返回其返回值类型。这个也非常常用

type ReturnType<T extends (...args: any[]) => any> = T extends (
  ...args: any[]
) => infer R
  ? R
  : never;
1
2
3
4
5