在 Nest.js 中映射实体到 DTO(反之亦然)

问题描述 投票:0回答:1

我正在使用 Nest.js 构建 API,我一直在使用映射器将 TypeORM 实体转换为 DTO(反之亦然)。

直到现在,我一直在手动执行此操作:

 public static async entityToDto(entity: UserEntity): Promise<UserDto> {
    const dto = new UserDto();

    dto.id = entity.id;
    dto.emailAddress = entity.emailAddress;
    dto.firstName = entity.firstName;
    dto.lastName = entity.lastName;
    dto.addressLine1 = entity.addressLine1;
    dto.addressLine2 = entity.addressLine2;
    dto.townCity = entity.townCity;
 
    [...]

    return dto;
  }

在我看来,这是一个不错的(尽管不灵活)方法。它明确控制哪些字段返回给用户。然而,我的印象是 DTO 的目的是有一个单一的地方来修改关于某事的数据。如果我需要添加一个字段,我必须修改 both DTO and 映射器。

每个实体都有一个映射器似乎是一种惯例。但是,如果我不想返回,例如

accountStatus
字段,我将不得不编写一个新的映射器。所以我现在有多个映射器需要修改。

我有写一个“通用”映射器的想法,它查看 DTO 中的字段,并将它们映射到实体中的字段。

我对 TypeScript 和 Nest.js 比较陌生,所以我想知道其他人是如何管理它的。

nestjs dto
1个回答
2
投票

我建议你试试打字稿内置的对象属性映射。基本上,您的实体可以根据类似的属性名称映射到 dto,如下所示

 public static async entityToDto(entity: UserEntity): Promise<UserDto> {
    const dto : UserDTO = ({
        ...entity,
        additionalProperty: entity.someProperty
    });

    return dto;
  }

任何在 DTO 和 Entity 之间共享相同名称的属性都将被映射。它更干净,更灵活。

© www.soinside.com 2019 - 2024. All rights reserved.