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

Nodejs Nestjs类型映射插件@nestjs/mapped-types的使用
[@nestjs](/user/nestjs)/mapped-types 是一个非常有用的 NestJS 插件,它可以帮助你创建和重用映射类型。这些映射类型可以用于 Dto(数据传输对象)之间进行转换,比如从请求体到服务层的实体对象。

下面我将通过几个简单的步骤来演示如何使用 [@nestjs](/user/nestjs)/mapped-types

1. 安装依赖

首先确保你已经安装了 [@nestjs](/user/nestjs)/mapped-types。如果没有,可以通过 npm 或 yarn 来安装:

npm install [@nestjs](/user/nestjs)/mapped-types
# 或者
yarn add [@nestjs](/user/nestjs)/mapped-types

2. 创建基本 DTO

假设我们有一个简单的 DTO,用于接收用户注册信息:

import { ApiProperty } from '[@nestjs](/user/nestjs)/swagger';

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

  @ApiProperty()
  readonly password: string;
}

3. 使用 [@nestjs](/user/nestjs)/mapped-types 创建映射类型

现在我们想要一个 DTO,它可以接受用户名和电子邮件,但只在内部处理时转换为 CreateUserDto 类型。

import { PartialType, OmitType } from '[@nestjs](/user/nestjs)/mapped-types';
import { CreateUserDto } from './create-user.dto'; // 假设这个文件包含上面的 Create User Dto

export class UpdateUserDto extends PartialType(
  OmitType(CreateUserDto, ['password'], { keepOptional: true })
) {
  @ApiProperty({ description: 'The user email' })
  readonly email: string;
}

在这个例子中,我们创建了一个新的 DTO UpdateUserDto,它继承自 PartialTypeOmitType 的组合。这意味着它会继承 CreateUserDto 的所有属性,但不会包含 password 属性,并且添加了一个新的 email 属性。

4. 在控制器中使用 DTO

最后,你可以像使用普通 DTO 一样,在控制器中使用这个新的 DTO:

import { Controller, Post, Body } from '[@nestjs](/user/nestjs)/common';
import { CreateUserDto } from './create-user.dto';
import { UpdateUserDto } from './update-user.dto';

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

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

这样,你就成功地使用了 [@nestjs](/user/nestjs)/mapped-types 来创建了一个映射类型的 DTO。这不仅使代码更加模块化和可维护,而且还能帮助避免重复代码。


3 回复

当然,@nestjs/mapped-types插件就像是给你的NestJS项目穿上了一双魔法鞋,让你在处理数据传输对象(DTO)时能轻松跳跃。想象一下,你有一个更新用户信息的需求,但你不想暴露所有字段。这时,你可以创建一个基础的更新DTO,然后用@nestjs/mapped-types来构建一个只包含你想让用户修改的字段的新DTO。

比如,你有这样一个基础更新DTO:

import { PartialType } from '[@nestjs](/user/nestjs)/mapped-types';
import { CreateCatDto } from './create-cat.dto';

export class UpdateCatDto extends PartialType(CreateCatDto) {}

这样,UpdateCatDto就只会继承CreateCatDto中那些可选的属性,完美地解决了你的问题!这就像给你的代码施了魔法,让它变得更简洁、更安全。


[@nestjs](/user/nestjs)/mapped-types 是 NestJS 提供的一个非常有用的库,它帮助我们更轻松地进行数据传输对象(DTO)的转换和映射。这在处理复杂的 API 请求时特别有用,因为它允许我们将 DTO 类型进行继承、部分映射等操作,而无需手动复制属性。

下面是一个简单的示例来展示如何使用 [@nestjs](/user/nestjs)/mapped-types

  1. 首先确保你的项目中已经安装了 [@nestjs](/user/nestjs)/mapped-types。如果没有,可以使用以下命令安装:

    npm install [@nestjs](/user/nestjs)/mapped-types
    
  2. 创建一个基本的 DTO 类。例如,假设我们要创建一个用户信息的 DTO 类:

    import { ApiProperty } from '[@nestjs](/user/nestjs)/swagger';
    
    export class CreateUserDto {
      @ApiProperty({ description: '用户名' })
      username: string;
    
      @ApiProperty({ description: '密码' })
      password: string;
    
      @ApiProperty({ description: '邮箱' })
      email: string;
    }
    
  3. 使用 [@nestjs](/user/nestjs)/mapped-types 创建一个新的 DTO 类,该类仅包含一部分原始 DTO 的属性:

    import { PartialType } from '[@nestjs](/user/nestjs)/mapped-types';
    import { CreateUserDto } from './create-user.dto';
    
    export class UpdateUserDto extends PartialType(CreateUserDto) {}
    

    在这里,UpdateUserDto 类将包含 username, password, 和 email 属性,但是它们将是可选的,因为 PartialType 会将所有属性标记为可选。

  4. 现在你可以在控制器中使用这些 DTO 类了。例如:

    import {
      Controller,
      Post,
      Body,
    } from '[@nestjs](/user/nestjs)/common';
    import { CreateUserDto, UpdateUserDto } from './dto';
    
    [@Controller](/user/Controller)('users')
    export class UsersController {
      @Post()
      create(@Body() createUserDto: CreateUserDto) {
        // 创建用户的逻辑
      }
    
      @Put(':id')
      update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
        // 更新用户的逻辑
      }
    }
    

通过这种方式,你可以灵活地管理和复用 DTO 类,而不需要重复编写相同的代码。[@nestjs](/user/nestjs)/mapped-types 还提供了其他类型如 PickType, OmitType 等,可以根据需要选择使用。

@nestjs/mapped-types 是一个用于简化数据传输对象(DTO)创建的库。它允许你基于已有的类来创建新的DTO,进行属性的映射和修改。

例如,你可以创建一个基础的查询条件类 BaseQueryDto

import { Type } from '@nestjs/mapped-types';
import { GetDateRangeDto } from './get-date-range.dto';

export class BaseQueryDto {
  dateRange: Type<GetDateRangeDto>;
}

然后通过继承并扩展这个类来创建一个新的 DTO 类:

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

export class CreateQueryDto {
  name: string;
}

export class QueryDto extends PartialType(CreateQueryDto) {}

这样,QueryDto 就包含了 CreateQueryDto 的所有属性,并且这些属性都会被设置为可选的。

回到顶部