import {registerDecorator, ValidationArguments, ValidationOptions, ValidatorConstraint, ValidatorConstraintInterface} from 'class-validator'; export function IsRepeat(property: string, validationOptions?: ValidationOptions) { return (object: any, propertyName: string) => { registerDecorator({ target: object.constructor, propertyName, options: validationOptions, constraints: [property], validator: IsRepeatConstraint, }); }; } @ValidatorConstraint({name: 'IsRepeat'}) // exact math when IsRepeat input. Example: @IsRepeat('password', { message: 'Password and confirm password does not match' }) export class IsRepeatConstraint implements ValidatorConstraintInterface { validate(value: any, args: ValidationArguments) { const [relatedPropertyName] = args.constraints; const relatedValue = (args.object as any)[relatedPropertyName]; return value === relatedValue; } defaultMessage(validationArguments?: ValidationArguments): string { return "validation.REPEAT_DOES_NOT_MATCH" // return "{"+validationArguments.property + "} " + "response.message.passwordRepeatNotMatch } }