I am creating my own Typescript decorators for validation, but they are not working together, only the first decorator is activated, the second is ignored. The property errors
should have a value, because the length passed is less than 3 characters, but is returning undefined.
function IsMoreThan(length: number) {
return (target: any, propertyKey: string) => {
let val = target[propertyKey];
const getter = () => val;
const setter = (value: string) => {
if (value.length <= length) {
Object.defineProperty(target, 'errors', {
value: `${propertyKey} must be more than ${length} characters`,
configurable: true
});
} else {
val = value;
}
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
configurable: true,
});
};
}
function IsString() {
return (target: any, propertyKey: string) => {
let val = target[propertyKey];
const getter = () => val;
const setter = (value: string) => {
const varType = typeof value;
if (varType !== 'string') {
Object.defineProperty(target, 'errors', {
value: `${propertyKey} must be a string, received ${varType}`,
configurable: true
});
} else {
val = value;
}
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
configurable: true
});
};
}
class CreateUserSerializer {
@IsString()
@IsMoreThan(3)
username: string;
constructor(username: string) {
this.username = username;
}
}
const user = new CreateUserSerializer('aa');
console.log(user.errors);
Here is a playground with the code for easier testing: TS Playground