繁体   English   中英

控制应用打字稿属性修饰符的顺序?

[英]Controlling the order in which typescript property decorators are applied?

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

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

class Product {        

    @IsNumber
    @IsPositive
    purchasePrice: Number;

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

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

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

我不是装饰专家,但我想到的是使用一个数字将验证元数据内置到每个装饰器中,以使验证器的执行按该数字排序。

因此,例如,@ IsGreaterThan验证器可以分配一个数字2 ,其他分配器分配一个数字1 ,这意味着该验证器应首先执行1标签的验证器,然后执行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语法本身就是糖,所以上面的代码看起来很奇怪,因为我只是想向您展示基本概念。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM