Почему IntelliJ генерирует различные инструкции импорта для файлов .spec?

#typescript #intellij-idea

Вопрос:

Интересно, почему IntelliJ Add import statement работает по-другому при использовании в файле спецификации:

Настройка очень проста.
В файле проекта tsconfig.base.ts мы указываем путь:

 {
  "compilerOptions": {

    "paths": {
      "@idea-import-spec/data": [ "libs/data/src/index.ts" ]
    }
  },
 

В одном lib каталоге у нас есть 3 файла:

util.ts экспортирует постоянную:

 export const TEST = 1;
 

и 2 файла, которые импортируют эту константу.
например, в data.ts

  • Добавить const x = TEST;
  • затем переместите курсор в конец TEST
  • нажмите ALT ENTER и выберите Add import statement
  • это добавит относительный импорт, что нормально и ожидаемо:
 import {TEST} from "./util";
 

Но когда я делаю то же самое в файле data.spec.ts , он использует импорт пути!

 import {TEST} from "@idea-import-spec/data";
 

Почему это по-другому и как это исправить?

Более подробная информация:

  • Вот полный тестовый репозиторий GitHub
  • Я даже изменил и tsconfig.lib.json то, и tsconfig.spec.json другое, чтобы иметь одинаковое содержание
  • Версия IntelliJ: 2021.1.2 Окончательная
  • Скриншот проблемы:
    введите описание изображения здесь

Ответ №1:

Если для параметра Использовать сопоставления путей из tsconfig.json установлено значение Всегда, среда IDE пытается использовать сопоставления при каждом добавлении импорта. Но, поскольку "@idea-import-spec/data" сопоставлено с libs/data/src/index.ts этим, в свою очередь, реэкспортируется все , из lib/data.ts чего, добавление сопоставленного импорта data.ts приведет к циклической зависимости-вот почему используется относительный путь. Но data.spec.ts не реэкспортируется в баррель, поэтому использование отображений путей там выглядит безопасным

Комментарии:

1. Спасибо, это звучит разумно. Но я Use path mappings from tsconfig.json установил значение Only in files outside specific paths , поэтому не должен ли IntelliJ всегда использовать относительный путь в этом случае (т. Е. в ts и в файле spec.ts)?

2. если вы измените сопоставления "@idea-import-spec/data/*": ["libs/data/*"] , это будет работать таким образом; но ваши сопоставления-это не сопоставление путей, а псевдоним файла

3. К сожалению, мы не можем изменить это, так как это предусмотрено nrwl-nx