有没有办法把这个代码

export class person {
  @IsString()
  @Column('text')
  name: string

  @IsOptional()
  @IsString()
  @Column('text')
  description?: string
}

变成类似于这个的东西
export class person {
  name: string
  description?: string
}

我知道需要装饰器,但是当每个属性必须声明 3 次或更多次属性类型时,SSOT 似乎丢失了。

有没有更简单的方法来解决这个问题?乔伊?模式生成?

最佳答案

如果您发现自己在属性上一遍又一遍地使用相同的装饰器集,您可以创建一个新的装饰器,将它们组合在一起。

const CombinedDecorator = (target, property, descriptor) => {
   IsOptional(target, property, descriptor);
   IsString(target, property, descriptor);
   Column('text')(target, property, descriptor);
}

class Person {
   @CombinedDecorator()
   name: string;
}

您可以提出其中一些涵盖您的常见用例,或者考虑将其转换为一个装饰器工厂,该工厂接受一个配置对象,并可选择根据参数应用装饰器。

我认为即使是装饰器的一点点重复也比使用 JOI 之类的东西要好得多,因为您仍然必须明确说明所有规则,但要在与实际模型分开的地方,允许多个事实来源。

关于nestjs - 带有 typeorm 和 class-validator 的 NestJS 实体中的 DRY 原则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54507039/

10-11 19:33