📌  相关文章
📜  import { PartialType } from '@nestjs mapped-types' - Javascript (1)

📅  最后修改于: 2023-12-03 15:15:48.865000             🧑  作者: Mango

介绍 import { PartialType } from '@nestjs/mapped-types'

当我们使用 NestJS 构建 API 时,我们通常会多次使用相同的数据结构,也就是相同的 DTO(Data Transfer Object)。这时,我们需要使用 mapped-types 库提供的 PartialType,实现复用代码、降低维护成本的目的。

首先,我们需要在项目中引入 mapped-types 库:

npm i @nestjs/mapped-types

然后在代码中引入 PartialType,代码如下:

import { PartialType } from '@nestjs/mapped-types';
PartialType 的使用

我们在构建 NestJS API 时,经常需要在两种情况下用到相同的 DTO:

  1. 用于创建资源的 DTO,包含了所有必填字段和可选字段。
  2. 用于更新资源的 DTO,包含了所有可选字段。

在这种情况下,我们可以使用 PartialType 来简化代码,避免重复定义相同的 DTO。

例如,我们需要使用以下两个 DTO:

// 创建 `users` 资源时,需要传递所有的必填字段和可选字段
export class CreateUserDto {
  username: string;
  password: string;
  email: string;
  phoneNumber?: string;
}

// 更新 `users` 资源时,只需要传递可选字段
export class UpdateUserDto {
  username?: string;
  password?: string;
  email?: string;
  phoneNumber?: string;
}

可以看到,UpdateUserDtoCreateUserDto 近似,只是将必填字段变成了可选字段。当对 CreateUserDto 进行任意类型的改变时,如果不想针对 UpdateUserDto 进行同样的更改,就必须在两处地方都进行修改,这会增加代码不稳定性、降低代码的可维护性。

使用 PartialType 可以大大简化代码:

// 创建 `users` 资源时,需要传递所有的必填字段和可选字段
export class CreateUserDto {
  username: string;
  password: string;
  email: string;
  phoneNumber?: string;
}

// 更新 `users` 资源时,只需要传递可选字段
export class UpdateUserDto extends PartialType(CreateUserDto) {}

PartialType(CreateUserDto) 可以创建一个 UpdateUserDto 类型,它包含了 CreateUserDto 所有的字段,但所有的字段都变成可选字段。

这样,当我们需要对 CreateUserDto 进行更改时,我们只需要在一个地方进行修改即可,UpdateUserDto 也会自动更新。

结论

使用 PartialType 有很多优点,能够提高代码的可维护性、降低重复性代码的产生,并使得代码更加健壮。

一旦我们掌握了 PartialType,我们可以很容易地创建其他类型的 DTO,例如 PickTypeOmitType 等。

如果您正在构建 NestJS API,尝试使用 PartialType 来优化您的代码吧!