【发布时间】:2021-01-05 05:40:23
【问题描述】:
我对我的装饰器有一个循环依赖,因为我的类 ThingA 与 ThingB 有关系,反之亦然。
我已经阅读了有关此问题的几个问题:
但我无法为我的案例找到有效的解决方案。
我尝试了很多人建议从@hasOne(ThingA) 更改为@hasOne(() => ThingA) 以强制延迟加载并打破依赖关系,但是这个解决方案不起作用,因为我无法获得构造函数名称。
我需要构造函数的名称(例如:'ThingA')将其添加到构造函数 ThingB 的元数据中。
按照我的原始代码(没有延迟加载修改)
事物A
@hasAtLeast(0, ThingB)
export class ThingA extends RTContent {
@IsEmail()
email: string;
}
事物B
@hasOne(ThingA)
export class ThingB extends RTContent {
@IsString()
description: string;
}
装饰者:
export type LinkConstraint<C extends RTContent> = {
content: string; // name of the constructor (ex. 'ThingA')
maxOccurrences: number;
minOccurrences: number;
constructor: { new(...args: any[]): C };
}
function constraintFactory<C extends RTContent>(minOccurrences: number, maxOccurrences: number, associated: { new(...args: any[]): C }) {
return (constructor: Function) => {
const constraints = Reflect.getMetadata('linkConstraints', constructor) || [];
const constraint: LinkConstraint<C> = {
content: associated?.name,
minOccurrences,
maxOccurrences,
constructor: associated
};
constraints.push(constraint);
Reflect.defineMetadata('linkConstraints', constraints, constructor)
}
}
export function hasOne<C extends RTContent>(associated: { new(...args: any[]): C }) {
return constraintFactory(1, 1, associated)
}
export function hasAtLeast<C extends RTContent>(minOccurrences: number, associated: { new(...args: any[]): C }) {
return constraintFactory(minOccurrences, Infinity, associated)
}
【问题讨论】:
标签: javascript node.js typescript import circular-dependency