Можно ли передать значения объекта декоратора Typescript во время выполнения?
У меня есть класс, который украшен ограничением @MinDate, как это:
export default class Order {
purchaseDate: Date;
@MinDate(this.purchaseDate)
receiptDate: Date;
}
При попытке проверить экземпляр Order
это действительно ошибки проверки. Мой вопрос, возможно ли / допустимо пройти в this.purchaseDate
в качестве аргумента @MinDate()
декоратор.
Другими словами, могут ли декораторы машинописи получать значения времени выполнения от объекта или эти значения должны быть доступны во время компиляции? Так, например:
@MinDate(new Date(12/22/2017)); //This should work?
@MinDate(this.someDate) // This will never work?
1 ответ
Нет, ты не можешь этого сделать.
Декораторы применяются к классам, а не к экземплярам, что означает, что нет this
когда вызывается функция декоратора.
Использование статического значения будет работать:
@MinDate(new Date(12/22/2017));
Но вы не можете использовать экземпляр экземпляра для этого.
Вы можете сделать это в конструкторе без декоратора:
export default class Order {
...
constructor() {
this.purchaseDate = ...
this.receiptDate = this.purchaseDate;
}
}
Возможно использование специального валидатора:
import {registerDecorator, ValidationOptions, ValidationArguments} from "class-validator";
export function IsGreaterThan(property: string, validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
name: "IsGreaterThan",
target: object.constructor,
propertyName: propertyName,
constraints: [property],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
const [relatedPropertyName] = args.constraints;
const relatedValue = args.object[relatedPropertyName];
return value > relatedValue;
}
}
});
};
}
Применение:
import { IsGreaterThan } from "./IsLongerThan";
export class Post {
purchaseDate: string;
@IsGreaterThan("purchaseDate", { message: "receiptDate must be greater than purchaseDate" })
text: string;
}
Более подробную информацию можно найти в документации: https://github.com/typestack/class-validator