Обнаружена круговая зависимость между несвязанными функциями - PullRequest
0 голосов
/ 09 апреля 2020

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

Первый файл:

// type-helper.ts
import {getPropertyIfExists} from "./helper";

export function isType(item: any, type: string, property?: string) {
  const target = getPropertyIfExists(item, property);
  if (typeof type !== "string") return false;
  else return typeof target === type;
}

export function isArray(item: any[] | any): item is any[] {
  return item && Array.isArray(item);
}

export function isObject(item: object | any): item is object {
  return item && typeof item === 'object';
}

Второй файл:

// helper.ts
import {isArray, isObject} from "./type-helper";

export function getPropertyIfExists(item: any, property?: string): any {
  if (property) return item[property];
  else return item;
}

export function removeUndefinedProperties<T>(obj: T): T {
  const keys = Object.keys(obj);
  for (const key of keys) {
    if (isArray(obj[key])) obj[key] = removeEmptyValuesFromArray(obj[key]);
    else if (isObject(obj[key])) obj[key] = removeUndefinedProperties(obj[key]);
    else if (item === undefined || item === null) delete obj[key];
  }
  return obj;
}

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

Итак, мои вопросы:

  1. Является ли предупреждение ожидаемым поведением? Я понимаю предупреждение, если у вас есть циклические зависимости между компонентами и службами, куда импортируется весь класс, но в этом случае нет циклической зависимости между фактически импортируемыми элементами.
  2. Если это не проблема, Есть ли способ заставить предупреждение исчезнуть для этой конкретной c ситуации (без удаления предупреждения из других циклических зависимостей)?

Спасибо!

1 Ответ

0 голосов
/ 09 апреля 2020

index.ts из папки утилит - это модуль барреля (баррель - это способ объединения экспорта из нескольких модулей в один удобный модуль. Сам баррель - это файл модуля, который реэкспортирует выбранные экспорты других модулей.)

Вы не можете импортировать сам модуль ствола. Потому что круговая зависимость появится. (будет выполнено бесконечное число импортируемых l oop)

index.ts
  type-helper.ts
  helper.ts

helper.ts -> index.ts -> type-helper.ts
                      -> helper.ts -> index.ts -> type-helper.ts
                                               -> helper.ts

Чтобы предотвратить это, вам необходимо импортировать точный патч

// helper.ts
// import {isArray, isObject} from "./helper";
import {isArray, isObject} from "./helper/type-helper";

export function getPropertyIfExists(item: any, property?: string): any {
  if (property) return item[property];
  else return item;
}

export function removeUndefinedProperties<T>(obj: T): T {
  const keys = Object.keys(obj);
  for (const key of keys) {
    if (isArray(obj[key])) obj[key] = removeEmptyValuesFromArray(obj[key]);
    else if (isObject(obj[key])) obj[key] = removeUndefinedProperties(obj[key]);
    else if (item === undefined || item === null) delete obj[key];
  }
  return obj;
}

Возможно, вместо helper.ts index.ts

это то же самое

helper.ts -> type-helper.ts -> helper.ts -> type-helper.ts ...

переместить функцию getPropertyIfExists () в type-helper.ts

...