控制应用typescript属性装饰器的顺序?

时间:2018-06-05 23:14:52

标签: javascript typescript validation decorator typescript-decorator

我正在考虑编写一个验证器来检查一个值是否大于另一个值。例如,购买价格高于销售价格。

但首先我们必须确保销售价格有效。所以我们可能会有这样的事情:

class Product {        

    @IsNumber
    @IsPositive
    purchasePrice: Number;

    @IsNumber
    @IsPositive
    @IsGreaterThan('purchasePrice')
    salesPrice: Number;
}

在这种情况下,@IsNumber@IsPositive应该在@IsGreaterThan注释执行之前在两个属性上执行。

我想知道这是否易于实现(或许有一些类级元数据)或者我是否应该编写简单的函数验证器来检查这种类型的东西。

我不是装饰专家,但有一种想法是使用一个数字在每个装饰器中内置验证元数据,以便验证器的执行按此编号排序。

例如,@ IsGreaterThan验证器可以分配号码2,其他号码分配号码1,这意味着验证器应首先执行1标记的验证器,并且然后2

1 个答案:

答案 0 :(得分:2)

装饰器不应该依赖于使用顺序。 它们应该是独立的并且独立工作。

在这种情况下,@IsGreaterThan应在内部使用@IsNumber,以确保目标是一个数字。

另一方面,控制订单很容易。最先应用。所以在你的情况下,你需要

class Product {
  @IsGreaterThan('purchasePrice')
  @IsPositive
  @IsNumber
  salesPrice: number
}

Decorator只是描述符函数的糖,这是一个更高阶函数,如下所示:

function IsNumber(target, key, descriptor) { ... }

所以上面的代码实际上只是(伪代码):

class Product {
  salesPrice = IsGreaterThan('puchasePrice')(IsPositive(IsNumber(Product, 'salesPrice')))
}

由于class语法本身就是糖,所以上面的代码看起来很奇怪,因为我只想向您展示基本概念。