Nest js 中的 DTO 继承仅包含来自父类的属性

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

我正在尝试创建一个 DTO 类,负责解析分页查询过滤器。

所以我创建了这个类:


    import { Transform } from 'class-transformer';
    import { IsNumber, IsOptional, IsEnum, Min } from 'class-validator';
    import { SortOrder } from '../enums/SortOrder';
    import { toNumber } from '../helpers/toNumber';
    
    export class GenericFilter {
      @Transform(({ value }) => toNumber(value, { default: 1 }))
      @IsNumber({}, { message: ' "page" atrribute should be a number' })
      @Min(1)
      public page?: number = 1;
    
      @Transform(({ value }) => toNumber(value, { default: 50 }))
      @Min(1)
      @IsNumber({}, { message: ' "pageSize" attribute should be a number ' })
      public pageSize?: number = 50;
    
      @IsOptional()
      public orderBy?: string;
    
      @IsEnum(SortOrder)
      @IsOptional()
      public sortOrder?: SortOrder = SortOrder.DESC;
    }

然后我尝试从其他 DTO 扩展此类以实现特定的过滤情况,如下所示:

    import { IsDateString, IsNumber, IsOptional } from 'class-validator';
    import { GenericFilter } from 'src/common/interfaces/GenericFilter';
    
    export class OperationLogFilterDto extends GenericFilter {
      @IsDateString()
      @IsOptional()
      public dateFrom?: Date;
    
      @IsDateString()
      @IsOptional()
      public dateTo?: Date;
    
      @IsNumber()
      @IsOptional()
      public userId?: number;
    }

并像这样使用它:

    import { Controller, Get, Query } from '@nestjs/common';
    import { OperationLogFilterDto } from './dto/OperationLogFilter.dto';
    import { AuditService } from './audit.service';
    
    @Controller('audit')
    export class AuditController {
      constructor(private service: AuditService) {}
    
      @Get('/operation-logs')
      getAllOperationLogs(@Query() filters: OperationLogFilterDto) {
        console.log(filters);
        return this.service.getOperationLogs(filters);
      }
    }

问题是控制台日志仅显示父类中的属性,并忽略我发送的包含在

OperationLogFilterDto

中的任何其他过滤器

即:

我该如何解决这个问题?

nestjs
1个回答
0
投票

我刚刚用于测试的请求有一个拼写错误..

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