📅  最后修改于: 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:
在这种情况下,我们可以使用 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;
}
可以看到,UpdateUserDto
与 CreateUserDto
近似,只是将必填字段变成了可选字段。当对 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,例如 PickType
、OmitType
等。
如果您正在构建 NestJS API,尝试使用 PartialType
来优化您的代码吧!