簡體   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