【问题标题】:Is it possible to pass Typescript decorator object values in at runtime?是否可以在运行时传递 Typescript 装饰器对象值?
【发布时间】:2017-09-30 06:09:04
【问题描述】:

我有一个用 @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?

【问题讨论】:

    标签: typescript ecmascript-6 typescript2.2 class-validator


    【解决方案1】:

    不,你不能那样做。
    装饰器应用于类而不是实例,这意味着调用装饰器函数时没有this

    使用静态值会起作用:

    @MinDate(new Date(12/22/2017));
    

    但你不能为它使用实例成员。

    你可以在没有装饰器的构造函数中做到这一点:

    export default class Order {
        ...
        constructor() {
            this.purchaseDate = ...
            this.receiptDate = this.purchaseDate;
        }
    }
    

    【讨论】:

    • 方法装饰器呢?
    【解决方案2】:

    可以使用自定义验证器:

        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#custom-validation-decorators

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 2010-10-13
      • 2022-11-29
      • 2015-12-13
      • 2017-02-04
      • 2022-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多