返回

TypeScript 官方手册翻译计划【十】:剖析类型操控——映射类型

前端

在软件开发中,我们经常会遇到需要基于某个类型创建出另一个类型的情况。例如,我们需要为某个对象添加额外的属性,或者需要将某个对象转换成另一种格式。在这种情况下,索引签名和映射类型就派上了用场。

索引签名允许我们为那些没有提前声明的属性去声明类型。这对于处理动态数据非常有用,因为我们无法提前知道所有可能出现的属性。

映射类型是基于索引签名的语法构建的。它允许我们根据一个类型创建另一个类型,并指定新类型中属性的类型。

映射类型有以下几个特点:

  • 它们可以用于创建新的类型,而无需修改现有类型。
  • 它们可以用于添加、删除或修改属性。
  • 它们可以用于更改属性的类型。

映射类型在TypeScript中有很多应用场景,例如:

  • 创建新的类型,其中包含其他类型的所有属性,以及一些额外的属性。
  • 删除或修改现有类型中的属性。
  • 更改现有类型中属性的类型。
  • 将一个对象转换成另一种格式。

下面我们通过几个示例来演示如何使用映射类型:

// 创建一个新的类型,其中包含另一个类型的所有属性,以及一些额外的属性
type Person = {
  name: string;
  age: number;
};

type PersonWithAddress = Person & {
  address: string;
};

const personWithAddress: PersonWithAddress = {
  name: "John Doe",
  age: 30,
  address: "123 Main Street"
};
// 删除或修改现有类型中的属性
type User = {
  name: string;
  age: number;
  password: string;
};

type UserWithoutPassword = Omit<User, "password">;

const userWithoutPassword: UserWithoutPassword = {
  name: "John Doe",
  age: 30
};
// 更改现有类型中属性的类型
type Product = {
  name: string;
  price: number;
  quantity: number;
};

type ProductWithDiscount = {
  [P in keyof Product]: P extends "price" ? number : Product[P];
};

const productWithDiscount: ProductWithDiscount = {
  name: "iPhone 12",
  price: 999.99,
  quantity: 1
};
// 将一个对象转换成另一种格式
type User = {
  name: string;
  age: number;
};

type UserDTO = {
  name: string;
  age: string;
};

const user: User = {
  name: "John Doe",
  age: 30
};

const userDTO: UserDTO = {
  name: user.name,
  age: user.age.toString()
};

映射类型是一种非常强大的工具,它可以帮助我们创建和使用各种各样的类型。在TypeScript中,映射类型被广泛用于创建新的类型、删除或修改现有类型中的属性,以及将一个对象转换成另一种格式。