Можно ли передать значения объекта декоратора 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

Другие вопросы по тегам