3

我有一个 DTO 过滤位置。要查询一些位置,我可以提供纬度、经度和半径。这三个都是可选字段,但是当我设置其中一个时,它也需要另外两个。所以我到目前为止

export class GetLocationsDTO {
    @IsNumber()
    @IsLatitude()
    // optional but requires longitude and radius
    @Type(() => Number)
    public latitude?: number;

    @IsNumber()
    @IsLongitude()
    // optional but requires latitude and radius
    @Type(() => Number)
    public longitude?: number;

    @IsNumber()
    // optional but requires latitude and longitude
    @Type(() => Number)
    public radiusInKilometers?: number;
}

有没有像这个样本的装饰器

@IsOptionalButDependsOn(['fieldFoo', 'fieldBar'])

所以这三个都是可选的,但是如果提供了其中一个,则还必须提供其他两个字段。

4

1 回答 1

2

我想你需要添加ValidateIf.

export class GetLocationsDTO {
    @IsNumber()
    @IsLatitude()
    @ValidateIf(o => o.radiusInKilometers !== undefined || o.longitude !== undefined)
    @Type(() => Number)
    public latitude?: number;

    @IsNumber()
    @IsLongitude()
    @ValidateIf(o => o.latitude !== undefined || o.radiusInKilometers !== undefined)
    @Type(() => Number)
    public longitude?: number;

    @IsNumber()
    @ValidateIf(o => o.latitude !== undefined || o.longitude !== undefined)
    @Type(() => Number)
    public radiusInKilometers?: number;
}
于 2020-04-24T17:59:09.227 回答