TypeScript сообщает об отсутствии экспортированного члена при повторном экспорте библиотеки - PullRequest
0 голосов
/ 05 марта 2020

Мы пытаемся обойти открытую проблему в библиотеке с открытым исходным кодом (назовем ее openfoo) без необходимости ее форка.

В нашей частной библиотеке, у нас есть зависимость от openfoo и devDependency от @ types / openfoo. Наша библиотека содержит файл openfoo-patch.ts, который выглядит следующим образом:

import * as openfoo from 'openfoo';
openfoo.Bar.prototype.etc = function () {}; // monkey patch
export * from 'openfoo';

В других наших библиотечных модулях (вызов одного xyz) мы делаем:

import { Bar } from '../openfoo-patch';

Это гарантирует, что наш патч запускается до запуска любых других модулей.

(Обратите внимание, что второй проект также является библиотекой, поэтому нет очевидного способа сказать «запустите это при запуске».)

Все отлично работает, включая модульные / интеграционные тесты.

Однако, когда мы попытались создать другую библиотеку , которая зависит от нашей частной библиотеки выше, мы получаем

node_modules/@ourcompany/ourfirstlibrary/build/xyz.d.ts: 1: 10 - ошибка TS2305: Модуль '"../.../oursecondlibrary/node_modules/@ourcompany/ourfirstlibrary/build/openfoo- patch "" не имеет экспортированного элемента 'Bar'.

1 import {Bar} из '../openfoo-patch';

Мы попытались переместить @ types / openfoo до полной зависимости в первой библиотеке; это не имеет значения. Установка @ types / openfoo во второй библиотеке также не помогла.

Как мы можем заставить нашу вторую библиотеку компилироваться?

(В настоящее время наша первая библиотека использует TypeScript v3.6.4, а наша вторая использует v3.8.2.)


Обновление

Один из обходных путей заключается в том, чтобы удалить export * from 'openfoo'; из файла исправления, а затем изменить другие модули на

import '../openfoo-patch'; // ALWAYS import before openfoo
import { Bar } from 'openfoo';

Для этого требуется два импорта, и для этого нужно, чтобы вызывающие абоненты помнили об этом.

...