TypeScript абсолютный импорт из другого проекта для обычных файлов TS и объявлений глобальной области видимости - PullRequest
1 голос
/ 06 марта 2020

Я оцениваю миграцию на TypeScript для большой базы кода в среде JavaEE. Существует несколько проектов с глубокой структурой каталогов и кодом JavaScript, в котором используются глобальные переменные и т.д. c. для всех проектов.

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

(1) JS код размещается глубоко внутри проектов, например "Project1 / src / main / resources / de / mycompany / webapp / ts". Сгенерированный код JS должен быть помещен в «Project1 / src / main / resources / de / mycompany / webapp / ts-generate». Для этой цели TypeScript предлагает rootDir и outDir.

(2) Структура папок сложная, поэтому относительный импорт невозможен. Например, ссылка на файл из проекта core всегда должна быть одинаковой - независимо от того, сделана ли она из проекта ui или ui-utils project. TypeScript предлагает "baseUrl" и "paths" для абсолютных ссылок. Тем не менее, это не похоже на работу с несколькими проектами (или я что-то не так). Например, я хочу import * from '@core/utils/mycode.ts'. Эту ссылку следует интерпретировать относительно core проекта *1022* baseUrl или rootDir .

(3) Я должен сделать ссылки на существующие JS код в глобальной области видимости. Для этой цели TypeScript предлагает файлы объявлений (.d.ts), которые можно использовать для предоставления компилятору дополнительной информации о типе. Таким образом, я планирую создать файлы объявлений для существующего JS кода. Затем объявления должны быть импортированы путем использования проектов TypeScript. Однако ключевое слово import в TypeScript, кажется, всегда импортирует объявления как module с пространством имен, что противоречит тому факту, что объекты JS привязаны к глобальной области видимости. Я также нашел Triple-Sla sh import , который, кажется, работает для относительных ссылок, но не для абсолютных ссылок на другие проекты.

Вопросы

Для (2): возможно ли иметь абсолютный импорт между проектами, предпочтительно из baseUrl или rootDir?

Для (3): можно ли импортировать (или ссылаться) объявления TypeScript из других проектов для JS код в глобальной области видимости. Обратите внимание, что это не должно генерировать какой-либо код, оно должно просто сообщать компилятору о существующем коде.

1 Ответ

1 голос
/ 13 марта 2020

Относительно (3)

Чтобы включить объявления типов глобальной области видимости (файлы .d.ts), TypeScript предлагает массив "typeRoots" в tsconfig. json: "typeRoots" : ["./typings"]. Обратите внимание, что эти файлы также должны быть доступны по путям в массиве «include» ("include": ["./typings/*.ts"]).

Это работает, потому что пути в «typeRoots» и «include» также могут указывать на каталог вне текущего project.

Относительно (2)

Это кажется невозможным при одном вызове компилятора TypeScript. Однако это возможно при компиляции проектов один за другим в порядке их зависимостей.

Таким образом, я предполагаю, что проект P1 без зависимостей уже скомпилирован. Теперь цель состоит в том, чтобы скомпилировать проект P2 , который использует код из P1 . В следующем примере предполагается, что «outDir» P1 является «build»:

  • Включить все файлы ts из «outDir» P1 через «include» массив Р2.
    • "include": ["../P1/build/*.ts"]
    • Это сделает скомпилированные файлы d.ts из P1 доступными в P2, так что компилятор TypeScript будет знать код из P1.
  • Добавьте псевдоним пути к «outDir» P1 через массив «paths» P2.
    • "paths": { "@P1/*": ["../P1/build/*"] }
    • Это заставит работать абсолютный импорт.

Это работает, потому что пути в «путях» и «включаемых» массив может указывать на каталог за пределами текущего проекта.

Обратите внимание, что в этом решении не используется Project References функция TypeScript. Также обратите внимание, что typeRoots не нужны, кроме случаев, когда вы хотите предоставить информацию о типе для простого JS кода. В противном случае информация о типе уже должна быть найдена в "outDir" P1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...