具有 typeorm 和 class-validator 的 NestJS 实体中的 DRY 原则
DRY principles in NestJS entities with typeorm and class-validator
有没有办法把这段代码转
export class person {
@IsString()
@Column('text')
name: string
@IsOptional()
@IsString()
@Column('text')
description?: string
}
变成类似这样的东西
export class person {
name: string
description?: string
}
我知道装饰器是必需的,但是当 属性 类型必须根据 属性 声明三次或更多次时,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 之类的东西相比,即使使用装饰器进行一点点重复也更可取,因为您仍然必须明确说明所有规则,但要在与允许多个来源的实际模型分开的地方真相。
有没有办法把这段代码转
export class person {
@IsString()
@Column('text')
name: string
@IsOptional()
@IsString()
@Column('text')
description?: string
}
变成类似这样的东西
export class person {
name: string
description?: string
}
我知道装饰器是必需的,但是当 属性 类型必须根据 属性 声明三次或更多次时,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 之类的东西相比,即使使用装饰器进行一点点重复也更可取,因为您仍然必须明确说明所有规则,但要在与允许多个来源的实际模型分开的地方真相。