TypeScript 提供了一些基本的类型工具,可以帮助我们进行类型编程。

本文主要介绍 TypeScript 中 8 种常用的类型工具,包括 Partial、Pick、Record、Omit、Exclude、Required、Readonly 和 ReturnType。

Partial

Partial 工具类型可以将一个对象的所有属性变为可选属性。例如,我们有一个 Person 接口定义如下:

interface Person {
  name: string;
  age: number;
  address: string;
}

现在我们想将 Person 对象中的所有属性都变成可选属性,可以使用 Partial 工具类型:

type PartialPerson = Partial<Person>;

这样,PartialPerson 的类型就变成了:

{
  name?: string | undefined;
  age?: number | undefined;
  address?: string | undefined;
}

Pick

Pick 工具类型可以从一个对象中选择需要的属性。比如对于下面的 Person 接口:

interface Person {
  name: string;
  age: number;
  address: string;
}

现在想从 Person 对象中只选择 name 和 age 属性,可以使用 Pick 工具类型:

type NameAndAge = Pick<Person, "name" | "age">;

这样,NameAndAge 的类型就变成了:

{
  name: string;
  age: number;
}

Record

Record 工具类型可以从一个对象中创建一个新的对象,该对象的属性和值的类型都可以自定义。比如,对于下面的 fruits 数组:

const fruits = ["apple", "banana", "orange"] as const;

现在想将 fruits 转换成一个对象,key 为 fruit 的名称,value 为 boolean 类型,可以使用 Record 工具类型:

type FruitFlags = Record<typeof fruits[number], boolean>;

这样,FruitFlags 的类型就变成了:

{
  apple: boolean;
  banana: boolean;
  orange: boolean;
}

Omit

Omit 工具类型可以从一个对象中删除指定的属性。比如对于下面的 Person 接口:

interface Person {
  name: string;
  age: number;
  address: string;
}

现在要从 Person 对象中删除 address 属性,可以使用 Omit 工具类型:

type NameAndAge = Omit<Person, "address">;

这样,NameAndAge 的类型就变成了:

{
  name: string;
  age: number;
}

Exclude

Exclude 工具类型可以从一个类型中排除指定的类型。比如对于下面的联合类型:

type Color = "red" | "blue" | "green";

现在想从 Color 类型中排除 "green",可以使用 Exclude 工具类型:

type NonGreenColor = Exclude<Color, "green">;

这样,NonGreenColor 的类型就变成了:

"red" | "blue"

Required

与 Partial 相反,Required 可以将一个类型的所有属性变为必选属性。例如,下面的 User 类型包含可选属性:

type OptionalUser = {
  name?: string;
  age?: number;
};

可以使用 Required工具类型将其转换为必选属性的类型:

type User = Required<OptionalUser>;

这样,User 类型就具有 name 和 age 两个必选属性:

{
  name: string;
  age: number;
}

Readonly

Readonly 工具类型可以将一个类型的所有属性变为只读属性。比如对于下面的 User 类型:

type User = {
  name: string;
  age: number;
};

我们可以使用 Readonly 工具类型将它的属性转换为只读属性的类型:

type ReadonlyUser = Readonly<User>;

这样,ReadonlyUser 的类型就成为了:

{
  name: string;
  age: number;
};

ReturnType

ReturnType 工具类型可以获取一个函数的返回值的类型。比如对于下面的函数:

function add(a: number, b: number) {
  return a + b;
}

要得到 add 函数的类型,可以使用 ReturnType 工具类型:

type AddReturnType = ReturnType<typeof add>; // number

需要注意的是,ReturnType 只能用于函数类型,如果用于其他类型会报错。

小结

本文简单介绍了 TypeScript 中常用的8个类型工具,可以实现类型编程,做一些简单的类型体操。在编写一些复杂的类型声明时,会经常使用到这些类型工具,基于它们实现更复杂的类型。