[英]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.