Nodejs Nestjs类型映射插件mapped-types的使用

Nodejs Nestjs类型映射插件mapped-types的使用
@nestjs/mapped-types 是 NestJS 提供的一个库,它包含了一些用于类型转换和映射的实用工具。这个库可以帮助你更方便地创建和操作 DTO(数据传输对象)。以下是如何使用 @nestjs/mapped-types 的一些基本示例。

1. 安装依赖

首先,确保你已经安装了 @nestjs/mapped-types

npm install @nestjs/mapped-types

2. 基本用法

创建一个基础 DTO

假设我们有一个用户注册的基本 DTO:

import { ApiProperty } from '@nestjs/swagger';

export class CreateUserDto {
  @ApiProperty()
  readonly username: string;

  @ApiProperty()
  readonly password: string;
}

使用 PartialType 进行部分更新

我们可以使用 PartialType 来创建一个允许部分字段更新的 DTO:

import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdateUserDto extends PartialType(CreateUserDto) {}

现在,UpdateUserDto 允许 usernamepassword 字段为可选的。

使用 PickType 选择特定字段

如果我们只想允许更新用户名,可以使用 PickType

import { PickType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdateUsernameDto extends PickType(CreateUserDto, ['username']) {}

这样,UpdateUsernameDto 只包含 username 字段。

3. 结合使用多个映射类型

我们还可以结合使用多个映射类型来创建更复杂的 DTO。例如,创建一个只允许更新密码的 DTO:

import { PickType } from '@nestjs/mapped-types';
import { OmitType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdatePasswordDto extends OmitType(CreateUserDto, ['username']) {
  @ApiProperty()
  readonly password: string;
}

这里,我们首先使用 OmitType 排除了 username 字段,然后手动添加了一个 password 字段。

4. 实际应用示例

在实际项目中,这些 DTO 可以被用于控制器的方法参数中:

import { Controller, Post, Body } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { UpdatePasswordDto } from './dto/update-password.dto';

@Controller('users')
export class UsersController {
  @Post('register')
  register(@Body() createUserDto: CreateUserDto) {
    // 处理注册逻辑
  }

  @Post('update')
  update(@Body() updateUserDto: UpdateUserDto) {
    // 处理部分更新逻辑
  }

  @Post('update-password')
  updatePassword(@Body() updatePasswordDto: UpdatePasswordDto) {
    // 处理密码更新逻辑
  }
}

通过这种方式,你可以灵活地创建和使用 DTO,同时保持代码的清晰和可维护性。


3 回复

当然,Mapped Types 在 NestJS 中非常有用,特别是在处理 DTO(数据传输对象)时。想象一下,你正在开发一个美食家应用,需要处理用户提交的食谱信息。你有一个原始的食谱对象,但你只想允许用户修改某些字段,比如 namedescription

首先,确保你安装了 class-transformerclass-validator,它们是 NestJS 类型映射的好伙伴。然后,你可以创建一个只包含 namedescription 的新类,或者更聪明地使用 Mapped Types 来生成它!

import { PartialType } from '@nestjs/mapped-types';
import { CreateRecipeDto } from './create-recipe.dto';

export class UpdateRecipeDto extends PartialType(CreateRecipeDto) {}

这样,UpdateRecipeDto 就可以用来接收部分更新了,而不需要重复定义那些不变的属性。是不是很酷?这就像给你的代码施展了魔法,让它能自动适应变化!


@nestjs/mapped-types 是一个非常有用的库,它允许你在 NestJS 中更方便地处理对象的映射和转换。这对于处理 DTO(数据传输对象)尤其有用,因为它可以帮助你创建新的 DTO 类型,这些类型是基于现有类型的映射或修改。

安装

首先,你需要安装 @nestjs/mapped-types

npm install @nestjs/mapped-types

基本使用

假设你有一个基本的用户 DTO:

import { ApiProperty } from '@nestjs/swagger';

export class CreateUserDto {
  @ApiProperty()
  readonly username: string;

  @ApiProperty()
  readonly password: string;
}

现在,你可能想要一个更新用户的 DTO,其中不包含密码字段。这时你可以使用 PickTypeOmitType

使用 PickType

PickType 用于从现有类中选择特定的属性来创建一个新的类。

import { PickType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdateUserDto extends PickType(CreateUserDto, ['username']) {}

使用 OmitType

OmitType 用于从现有类中移除某些属性来创建一个新的类。

import { OmitType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdateUserDto extends OmitType(CreateUserDto, ['password']) {}

高级使用

你还可以结合其他映射类型来实现更复杂的逻辑。例如,你可能需要一个包含部分可选字段的 DTO:

import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdateUserDto extends PartialType(CreateUserDto) {}

在这个例子中,UpdateUserDto 将会继承 CreateUserDto 的所有属性,并将它们全部设置为可选。

总结

通过使用 @nestjs/mapped-types,你可以极大地简化 DTO 的定义和维护过程,特别是在需要创建多个具有相似结构但细节略有不同的 DTO 时。这不仅提高了代码的可读性,还减少了重复代码的数量。

@nestjs/mapped-types 是一个 NestJS 提供的工具,用于简化对象属性的映射。你可以创建继承自现有 DTO(数据传输对象)的新 DTO,并添加、修改或删除属性。

例如:

import { PartialType } from '@nestjs/mapped-types';
import { CreateCatDto } from './create-cat.dto';

export class UpdateCatDto extends PartialType(CreateCatDto) {}

上述代码中,UpdateCatDto 将继承 CreateCatDto 的所有属性,并且这些属性变为可选,方便更新操作。

回到顶部