typescript - Kan jag jämföra numervariabler med 'class-validator'?
Hej! Jag har en fråga om class-validator
Min klient kommer att begära flera nummer och jag behöver jämföra värden med varandra.
Jag vill ha kod som nedan.
const validator: SomeValidator = new SomeValidator;
validator.first = 1000;
validator.second = 2000; // this will be greater than validator.first
validator.third = 3000; // this will be greater than validator.second
Och jag försökte använda inmatningsvariabeln i @Min()-validatorn som nedan
import { IsInt, Min } from 'class-validator';
class SomeValidator {
@IsInt()
@Min(0)
public first: number;
@IsInt()
@Min(this.first) // it occurs TS7017
public second: number;
@IsInt()
@Min(this.second) // it occurs TS7017
public third: number;
}
Och jag fick TS7017-fel.
TS7017: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.
Finns det något perfekt sätt att hantera detta?
Jag vet att det finns ett enkelt sätt som nedan, men jag önskar att det fanns ett sätt att använda class-validator.
if ((first > second) || (second > third)) {
res.status(400).json({
message: 'validation failed',
});
return next(new Error('some error'));
Svar #1
Ja, du kan, men inte inbyggt, du kommer i det här fallet att behöva skapa din egen dekoratör som implementerar denna validering. Här är ett exempel:
Skapa först din dekoratorvalidator
// file validators/is-bigger-than.ts
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';
export function IsBiggerThan(property: string, validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
name: 'isBiggerThan',
target: object.constructor,
propertyName: propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = (args.object as any)[relatedPropertyName];
return typeof value === 'number' && typeof relatedValue === 'number' && value > relatedValue;
},
},
});
};
}
Importera det sedan i ditt dto
import { IsBiggerThan } from '../../validators/is-bigger-than';
export class SomeObjectDTO {
minValue: number;
@IsBiggerThan('minValue', {
message: 'maxValue must be larger than minValue',
})
maxValue: number;
}
Testad och fungerar (Se källan till enhetstesterna):
