2016-08-17 81 views
4

我一直在擺弄與打字稿裝飾,我有一個簡單的問題,假設我有一個定製的裝飾叫做RetainType像這樣一類:是否可以將TypeScript裝飾器應用於類中的所有字段?

class Person { 
    @RetainType name: string; 
    @RetainType age: number; 
    @RetainType dateOfBirth: Date; 
} 

我想能寫:

@RetainType class Person { 
    name: string; 
    age: number; 
    dateOfBirth: Date; 
} 

換句話說,是否有任何方法可以將裝飾器應用於類中的所有屬性?我使用@RetainType發送有關各個屬性的元數據(設計:專門類型)。有一個更簡潔的方法,比逐個註釋所有字段更好。

+0

'RetainType'做什麼?你可以添加代碼嗎? –

+0

從字面上看,它是一個空的裝飾器,我只是用它來強制TypeScript編譯器生成設計:鍵入元數據(請參閱https://www.typescriptlang.org/docs/handbook/decorators.html)。 –

+0

不,你不能用類裝飾器做到這一點,因爲當裝飾器函數被調用時,屬性將不會從類構造器中獲得。您可以爲每個屬性添加@ @ Reflect.metadata(「design:type」,PROPERTY_TYPE)',然後用類裝飾器以某種方式使用這些屬性,但我不明白這比使用'RetainType'裝飾器好多了。 –

回答

1

屬性裝飾器適用於一個屬性。它什麼都不返回,只是做一些有關財產的東西。

類裝飾器應用於類構造函數。所以它應該返回一些函數來替代正常的構造函數。

在課堂裝飾功能,你可以做任何事情 - 甚至枚舉所有類屬性與預期的方式裝飾它們。所以,如果編寫額外的代碼,你可以做你想做的。但是你不能使用屬性裝飾器作爲類裝飾器而不改變它們。它不會工作。

+0

所以你說我可以在類裝飾器中添加屬性裝飾器?你能提供一個簡短的例子嗎? –

+0

再說一遍:'如果編寫額外的代碼,你可以做你想做的事。但是,你不能使用屬性裝飾器作爲類裝飾器而不改變它們。 因此,回答你的問題:編寫一個枚舉所有類屬性並分別改變它們的**類**裝飾器。 –

+1

問題是屬性本身沒有改變,我在屬性上的裝飾器是完全空的。其唯一目的是強制打印腳本編譯器生成元數據(請參閱'emitDecoratorMetadata'編譯器選項)。在裝飾器中沒有這樣做的代碼,它僅僅是使編譯器發出元數據的裝飾器的存在。我想我必須以某種方式將屬性裝飾器應用於所有屬性,以便在類裝飾器中執行此操作,但我不知道如何甚至可能。 –

相關問題