[在构建我正在从事的项目时,我偶然发现了循环依赖问题:一个小的ORM,用于学习。
重现问题的最小项目可以找到here。这里是一个更简单的概述:
文章:
import { ManyToMany } from './ManyToMany';
import { Tag } from './Tag';
export class Article {
@ManyToMany(Tag)
tags: Tag[] = [];
}
ManyToMany:
//no imports
export function ManyToMany(entity) {
…
}
标签:
import { ManyToMany } from './ManyToMany';
import { Article } from './Article';
export class Tag {
@ManyToMany(Article)
articles: Article[] = [];
}
重要的是,不要对代码进行太多更改或根本不要更改,因为这会影响DX。我不希望该库的用户创建其他黑客文件来解决此问题。
我找到了一个讨论列表,但没有一个是优雅的:
我能找到的最佳解决方案是使用内部模块模式。此解决方案和所有其他解决方案只是解决该问题的方法和变通办法,实际上没有一个解决方案。
是否有一个更好,更优雅的解决方案,而无需创建其他文件或移动代码?
根据Bergi的评论,可行的解决方案是使引用变得惰性,即传递一个返回实体的函数,而不是立即对它进行评估(在属性修饰期间),但是稍后在加载所有模块时,将初始化类,并且创建了第一个实例。
我已经尝试在此处实现相同的https://stackblitz.com/edit/typescript-f5rm9u。请检查执行情况。
文章:
import { ManyToMany } from './ManyToMany';
import { Tag } from './Tag';
export class Article {
@ManyToMany( Tag => Tag)
tags: Tag[] = [];
}
标签
import { ManyToMany } from './ManyToMany';
import { Article } from './Article';
export class Tag {
@ManyToMany(Article => Article)
articles: Article[] = [];
}
答案信用:@Bergi