2016-08-17 51 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'编译器选项)。在装饰器中没有这样做的代码,它仅仅是使编译器发出元数据的装饰器的存在。我想我必须以某种方式将属性装饰器应用于所有属性,以便在类装饰器中执行此操作,但我不知道如何甚至可能。 –

相关问题