使用打字稿和类转换器将多个属性映射到单个嵌套对象

我正在使用类转换器(在 nestjs 中)将我的数据库实体转换为 dto 类型以从我的 api 输出。

我的数据库实体如下所示:

class MyEntity {
  id: string;
  property1: string;
  property2: string;
}

但我的 API 需要输出类似

class NestedDto {
  property1: string;
  property2: string;
}

class MyDto {
  id: string;
  nested: NestedDto;
}

那么,使用类转换器,我如何将这两个属性组合成一个嵌套对象?

我试过像这样使用 @Transform

class MyDto {
  @Expose()
  id: string;

  @Transform(p => ( property1: p.obj.property1, property2: p.obj.property2 }));
  nested: any;
}

它在技术上有效,但它不能扩展并且不是很干净。

有没有更好的方法来使用类转换器来实现这一点?

此外,对于奖励积分,如果这两个属性在数据库中为空,那么 api 上的嵌套属性不存在会很好 - 尽管这是很好的,而不是要求:)

stack overflow map multiple properties to single nested object using typescript and class-transformer
原文答案

答案:

作者头像
class MyDto {
  @Expose()
  id: string;

  @Transform((p: MyEntity) => ( property1: p.obj.property1, property2: p.obj.property2 }));
  @IsOptional()
  nested: NestedDto;
}

YOLO 我没用过nestjs

作者头像
  @Transform(({ value, obj }) => {
value = new Card();
value.expiration = obj.expiryDate;
return value;}) productForeignCard: Card;

尝试这个

作者头像

我有同样的问题,我想将一个 geoJson 数据映射到一个更人性化的 {'long':..., 'lat':...} ,这意味着映射输入数据和输出数据。我将其用作输入 DTO 以将上述模式转换为 geojson。

@ValidateNested({ each: true }),
@Type(() => DBLocationDto),
@Transform(
  ({ value }) =>
    morphism(
      {
        type: () => 'Point',
        coordinates: iteratee => [iteratee.lng, iteratee.lat],
      },
      value,
      HumainLocationDto,
    ),
  { toPlainOnly: true }
)

然后在我的输出 DTO 中我几乎相同,相反

@Type(() => HumainLocationDto),
@Transform(
  ({ value }) =>
    morphism(
      {
        lng: iteratee => iteratee.coordinates[0],
        lat: iteratee => iteratee.coordinates[1],
      },
      value,
      DBLocationDto,
    ),
  { toClassOnly: true },
)

如您所见,我正在使用态射将 my 映射到类,但您可以直接自己完成。

PS:当位置根本不存在时,我遇到了一个问题,它被认为是可选的,我通过使用 @IsDefined() 强制定义来修复它

作者头像

此外,您可以这样制作:

class NestedDto {
  @Expose()
  property1: string;
  @Expose()
  property2: string;
}

class MyDto {
  id: string;

  @Transform((data) => plainToClass(NestedDto, data.obj, { strategy: 'excludeAll' }))
  nested: NestedDto;
}