pagination - Typescript + NestJs + Class Transformer: Hur man använder generiska typer i response DTO?


Jag har flera endpoints som returnerar ett svar inklusive paginationdetaljer. Jag skulle vilja använda en föräldratyp för pagineringen och skicka in olika datatyper för data-parametern.

Jag försökte följande, men detta fungerade inte eftersom uttalandet i @Type ger felet 'T' refererar endast till en typ, men används här som ett värde., så det förväntar sig ett värde/klass och inte en typ:

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);
  }
}

Jag sökte och hittade detta, vilket i princip fungerar, men tyvärr verkar det som att svaret transformeras två gånger, vilket orsakar problem med datum.

Finns det något annat sätt att göra detta på (istället för att skriva flera PaginatedResponseDto-klasser)?

Svar #1

Du kan göra något i stil med detta...

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;
  }
}

Relaterade artiklar