Красивое решение проблемы циклических зависимостей в Javascript / Typescript - PullRequest
2 голосов
/ 20 октября 2019

Я только что наткнулся на проблему циклических зависимостей при создании проекта, над которым я работаю: небольшой ORM, для целей обучения.

Минимальный проект для воспроизведения проблемы можно найти здесь ,Вот еще более простой обзор:

Артикул :

import { ManyToMany } from './ManyToMany';
import { Tag } from './Tag';

export class Article {
    @ManyToMany(Tag)
    tags: Tag[] = [];
}

ManyToMany :

//no imports
export function ManyToMany(entity) {
    …
}

Tag :

import { ManyToMany } from './ManyToMany';
import { Article } from './Article';

export class Tag {
    @ManyToMany(Article)
    articles: Article[] = [];
}

Важно, чтобы код не менялся слишком сильно или не изменялся вообще, потому что это влияет на DX. Я не хочу, чтобы пользователи этой библиотеки создавали дополнительные хакерские файлы для решения этой проблемы.

Я нашел список обсуждений, но ни одно из них не является элегантным:

Лучшее решение, которое яможно найти, используя шаблон внутреннего модуля. Это и все другие решения - всего лишь способы решения этой проблемы, и ни одно из них на самом деле не решает ее.

Есть ли лучшее, более элегантное решение без создания дополнительных файлов или перемещения кода?

1 Ответ

0 голосов
/ 20 октября 2019

Согласно комментарию Берги, решение, которое будет работать, состоит в том, чтобы сделать ссылку ленивой, то есть передать функцию, возвращающую сущность, и не оценивать ее сразу (во время оформления свойства), но позже, когда все модули загружены, классы инициализируютсяи первый экземпляр создается.

Я попытался реализовать то же самое https://stackblitz.com/edit/typescript-f5rm9u здесь. Пожалуйста, проверьте реализацию.

ManyToMany

export function ManyToMany(entity=() => entity) {
    return function(target, name)  {
        console.log(entity.name);
    };
}

Ответный кредит: @ Bergi

...