Сбой сборки Typescript при добавлении Angular в Monorepo (столкновение типов Jasmine и Jest) - PullRequest
0 голосов
/ 22 сентября 2019

Gist

У меня есть Monorepo только с пакетами Typescript.Когда я запускаю tsc --build, все пакеты будут скомпилированы в Javascript.Это работало нормально, пока я не добавил пакет, содержащий приложение Angular.

Для тестирования своих пакетов я использую Jest.Но Angular использует Jasmine.

Issue

При запуске tsc --build сейчас кажется, что типы Jasmine и Jest конфликтуют.

Я получаюВсего 184 ошибки.Исходя из node_modules/@types/jest и node_modules/@types/jasmine и моих собственных пакетов:

Ошибки

Я показываю только несколько фрагментов из журнала ошибок, так как было бы слишком долго вставлять целоевещь.Вы можете найти полный журнал ошибок здесь: https://gist.github.com/flolude/115e92ca13cd8c86a4dca03528b92d4f

Jest node_modules/@types/jest/index.d.ts: 1310: 9 - ошибка TS2717: последующие объявления свойств должны иметьтого же типа.Свойство 'message' должно иметь тип 'string', но здесь имеет тип 'string |(() => строка) '.

1310         message: string | (() => string);
             ~~~~~~~

Жасмин

node_modules/@types/jasmine/ts3.1/index.d.ts:304:9
    304         message?: string;
                ~~~~~~~
    'message' was also declared here.

Мои собственные пакеты

services/gateway/src/gateway.server.ts:7:24 - error TS2307: Cannot find module '@cents-ideas/utils'.

7 import { Logger } from '@cents-ideas/utils';
                         ~~~~~~~~~~~~~~~~~~~~

Solution

Все компилируется без ошибок, когда я удаляю типы Jasmine из package.json проекта Angular.Вот почему я уверен, что они вызывают ошибки.Но мне нужны эти пакеты для тестирования с Angular.

"devDependencies": {
    // no errors when I remove those 2 packages
    "@types/jasmine": "~3.3.8",
    "@types/jasminewd2": "~2.0.3",
    // ...
  }

Исходный код

Как я уже упоминал, я работаю в Monorepo.Вот исходный код, если вам нужна дополнительная информация:

1 Ответ

1 голос
/ 23 сентября 2019

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

  1. Не используйте Jasmine в вашем Angular Project.
  2. Используйте -skipLibCheck tscflag
  3. Используйте typeRoots

Не используйте Jasmine в своем Angular Project.

Поскольку вы, похоже, начинаете новый Angular проект и фактически не написалилюбые тесты Angular на основе жасмина, вы также можете просто использовать Jest для этого проекта.Если в проекте Angular уже есть тесты Jasmine, миграция также довольно проста.

Использовать -skipLibCheck tsc flag

Это предотвратит проверку типов файлов типов библиотеки.Однако некоторые ошибки теперь могут остаться незамеченными и могут поразить вас во время выполнения ( Руководство по TypeScript )

Использовать TypeRoots

Используя tsconfig typeRoot compilerOptions , выможет специально извлекать и исправлять конфликты в соответствующих декларациях .d.ts.

вам нужно как-то «разорвать связь» между двумя декларациями.поэтому, рассмотрите возможность создания новой папки: "overrides" и добавьте "overrides \ jest \ index.d.ts", как вы думаете, должно быть.затем обновите файл tsconfig.json, добавив в него "typeRoots": [". \ overrides", ". \ node_modules @ types"].Для этого он указывает компилятору сначала искать типы в «. \ Overrides \ jest», а если он не нашел его, искать в «. \ Node_modules @ types \ jest» `. GitHub Source

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

...