Как сделать пакет NPM, который использует глобальные типы, но не дополняет проект, используя его? - PullRequest
2 голосов
/ 16 апреля 2019

Вопрос:

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

В TypeScript, как и в ECMAScript 2015, любой файл, содержащийверхний уровень import или export считается модулем.И наоборот, файл без каких-либо объявлений import или export верхнего уровня обрабатывается как сценарий, содержимое которого доступно в глобальной области (и, следовательно, также для модулей).

I 'Я использовал эти глобальные типы в моем проекте, и они работали нормально.Но потом я решил превратить проект в модуль NPM.«Глобальные» типы этого модуля должны быть видны только для самого модуля.

Сначала я установил модуль таким, какой он был, без добавления каких-либо <reference/> s и typeRoots.Однако при импорте модуля в другой проект TypeScript не смог найти глобальные типы и не скомпилировал.

Затем я добавил <reference path="types.ts" /> ко всем файлам в модуле, которые использовали глобальные типы, затем ятолкнул снова.К моему удивлению, это сделало типы доступными не только для модуля, но и для всего проекта, который его использовал, что привело к конфликтам между локальными типами и типами модуля.

(Обратите внимание, что обе версиимодуль, который я опубликовал, был идеально компилируемым сам по себе, проблемы начались, когда я установил модуль, используя npm i в другом проекте.)

Есть ли способ сделать "глобальные" типы модулядоступно только в модуле?


Структура моего модуля:

.
├── dist
│   ├── index.d.ts
│   ├── index.js
│   ├── foo.d.ts
│   ├── foo.js
│   ├── types.d.ts
│   └── types.js
├── package.json
├── src
│   ├── index.ts  ← contains import/export
│   ├── foo.ts    ← contains import/export
│   └── types.ts  ← contains only types, no import/export
└── tsconfig.json

Для первой публикации index.ts и foo.ts содержат только обычный код - чтозаставил типы не быть распознанными, когда проект.Когда я опубликовал модуль во второй раз, я добавил ///<reference path="types.ts"/> к index.ts и foo.ts.Это было переведено в path="types.d.ts" в скомпилированных файлах index.d.ts и foo.d.ts.

package.json:

{
  "name": "@foo/foo",
  "version": "1.0.0",
  "main": "dist/index.js"
}

tsconfig.json:

{
  "include": ["./src"],
  "compilerOptions": {
    "moduleResolution": "classic",
    "outDir": "./dist",
    "module": "commonjs",
    "declaration": true
  }
}

1 Ответ

1 голос
/ 17 апреля 2019

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

Вы можете попытаться определить свои глобальные типы в отдельной библиотеке (обратитесь к вашему предыдущему вопросу , чтобы узнать, как это сделать; на этот раз библиотека может быть такой же простой, как my-global-library/index.d.ts, если только вам не нужно импортировать типизации из родственных зависимостей - в этом случае вы можете подумать об их выделении в общую библиотеку), а затем установить эту библиотеку как devDependency вашего пакета NPM. Любой проект, который использует ваш пакет NPM, не установит devDependency.

...