Pesquisa de site

paginação - Typescript + NestJs + Class Transformer: Como usar tipos genéricos em DTO de resposta?


Eu tenho múltiplos endpoints que retornam uma resposta incluindo detalhes de paginação. Eu gostaria de usar um tipo pai para a paginação e passar diferentes tipos de dados para o parâmetro data.

Eu tentei o seguinte, mas isso não estava funcionando porque a declaração em @Type gera o erro 'T' se refere apenas a um tipo, mas está sendo usado como um valor aqui., então ele espera um valor/classe e não um tipo:

export class PaginatedResponseDto<T> {
  @Expose()
  @ApiProperty()
  skip: number;

  @Expose()
  @ApiProperty()
  take: number;

  @Expose()
  @ApiProperty()
  count: number;

  @Expose()
  @ApiProperty()
  @Type(() => T[]) // <- this is not working, because I cannot use `T` here
  data: T[];

  constructor(data: any) {
    Object.assign(this, data);
  }
}

Eu pesquisei e encontrei isso, que basicamente funciona, mas infelizmente parece transformar a resposta duas vezes, o que causa problemas com datas.

Existe alguma outra maneira de fazer isso (em vez de escrever múltiplas classes PaginatedResponseDto)?

Resposta #1

Você pode fazer algo nesse sentido...

export class PaginatedResponseDto<T> {

  @Exclude()
  private type: Function;

  @Expose()
  @ApiProperty()
  @Type(opt => (opt.newObject as PaginatedResponseDto<T>).type)
  data: T[];

  constructor(type: Function) {
    this.type = type;
  }
}

Artigos relacionados