Ссылка/импорт классов из типизации/другого проекта

У меня есть приложение SPA в Visual Studio, написанное на TypeScript (2.0) и использующее Aurelia. Но мои проблемы не относятся к Aurelia или VS.

Теперь я хотел бы написать плагины для этого приложения в другом проекте. Эти плагины должны будут ссылаться/импортировать классы/модули из основного приложения.

Это в основном работает, но проект плагина не знает о классах/модулях из основного приложения. Поэтому, хотя все компилируется и работает правильно (благодаря JavaScript), среда IDE (Visual Studio, VS Code или компилятор машинописного текста NPM) жалуется Не удается найти модуль 'abc' при любом импорте. Это также означает, что в этих классах нет поддержки Intellisense или автозаполнения.

Я не создал объявления (*.d.ts) в основном проекте и создал задачу сборки, чтобы скопировать их в проект плагина. Но все равно их не узнают. Как заставить проект подключаемого модуля распознавать эти классы из файлов объявлений?

Основное приложение имеет такой класс, как core/events.ts. Его DTS может выглядеть так:

export declare class Events {
    static MY_CONSTANT: string;
}

В проекте плагина есть плагин: Plugins/PluginA/plugin-panel.ts. Ему нравится импортировать Events из core/events.ts:

import { Events as e1 } from 'core/events';
import { Events as e2 } from 'typings/core/events';

Первая строка (e1) похожа на импорт Events в основной проект, и она действительно работает, когда скомпилированный файл javascript помещается в приложение. Но компилятор жалуется на это (семантическая ошибка).

Вторая строка (e2) не имеет предупреждения компилятора, но неверна во время выполнения.

Типы были скопированы в Plugins/typings/, здесь Plugins/typings/core/events.d.ts. Только папка Plugins содержит файлы TypeScript, остальная часть проекта — C#. В корневой папке есть tsconfig.json, который, я думаю, будет интересен:

{
  "version": "2.0.0",
  "compileOnSave": false,
  "compilerOptions": {
    "rootDir": "./",
    "sourceMap": true,
    "target": "es6",
    "module": "amd",
    "declaration": false,
    "noImplicitAny": false,
    "noResolve": true,
    "removeComments": true,
    "noLib": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  },
  "filesGlob": [
    "./Plugins/**/*.ts",
    "./Plugins/typings/**/*.d.ts"
  ],
  "exclude": [
    "node_modules"
  ],
  "atom": {
    "rewriteTsconfig": false
  }
}

Я уже пытался установить rootDir в ./Plugins, но это тоже не помогло.

Как я могу настроить проект, чтобы оператор импорта работал одинаково при разработке плагинов и при развертывании в приложении?

Примечание. Когда я добавляю сопоставление для импорта в конфигурацию загрузчика основного приложения (это config.js для SystemJS, которое я использую здесь, строка выглядит так: "typings/core/events": "core/events",), основное приложение может работать с другим путем импорта. Но это потребовало бы от меня настройки сопоставления для каждого файла машинописного текста в основном проекте.


person ZoolWay    schedule 29.07.2016    source источник


Ответы (1)


При поиске другой проблемы import я нашел этот вопрос: Абсолютное разрешение пути модуля в файлах TypeScript в VSCode. Обратите внимание, что я ссылаюсь на ответ Лехната.

По-видимому, в TypeScript 2.0 есть новая опция компилятора baseUrl, которая устанавливает базовые пути разрешения для модулей с относительным путем!

Таким образом, я могу разрешать модули/классы из своих типов, добавляя к моему compilerOptions:

"baseUrl": "./Plugins/typings/"

Это работает в Visual Studio, компиляторе командной строки и VS Code (обратите внимание, что VS Code требует настройки конфигурации для использования локального компилятора машинописного текста проекта).

person ZoolWay    schedule 29.07.2016