有没有办法解决在类内部大量使用装饰器的问题?
这是NestJS应用中类的单个属性的示例,带有不完整的草率文档装饰器:
@ApiModelProperty({
description: 'description',
})
@Expose()
@MaxLength(100, { message: 'message' })
@IsString({ message: 'message' })
@ValidateIf(address=> address.id !== null)
@NotEquals(undefined, { message: 'message' })
address: string;
这很快就变得庞大而丑陋。有什么方法可以使代码看起来更简洁,在另一个文件中定义装饰器?
答案 0 :(得分:8)
装饰器是常规的打字稿功能。您可以尝试将多个装饰器组合为一个装饰器。例如,您可以将验证者混合到单个装饰器中,如下所示:
function apiStringField(maxLength: number, message: string, description?: string) {
return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
ApiModelProperty()(target, propertyKey, descriptor)
Expose()(target, propertyKey, descriptor)
MaxLength(maxLength, { message })(target, propertyKey, descriptor)
IsString({ message })(target, propertyKey, descriptor)
NotEquals(undefined, { message })(target, propertyKey, descriptor)
}
}
然后,像这样使用它(在导入后):
@apiStringField(100, 'message', 'description')
address: string;
答案 1 :(得分:0)
不太确定在nestjs / common库下它已经存在了多长时间,但是我迷失了这个问题,以防其他人迷失了这个问题。在请求他们的官方不和之后寻求帮助后,jmcdo29建议了https://docs.nestjs.com/custom-decorators#decorator-composition,这似乎是可行的方法。