我正在考虑编写一个验证器,以检查一个值是否大于另一个值。例如,购买价格大于销售价格。
但是首先我们必须确保销售价格有效。所以我们可能会有这样的事情:
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
语法本身就是糖,所以上面的代码看起来很奇怪,因为我只是想向您展示基本概念。