У меня есть приложение 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",
), основное приложение может работать с другим путем импорта. Но это потребовало бы от меня настройки сопоставления для каждого файла машинописного текста в основном проекте.