我在Visual Studio中有一个SPA应用程序,它是用TypeScript(2.0)编写的,并使用Aurelia。但我的问题并不是Aurelia或VS所特有的。
现在我想在另一个项目中为此应用程序编写插件。这些插件必须从主应用程序引用/导入类/模块。
这基本上有效,但插件项目不知道主应用程序中的类/模块。因此,尽管编译和运行正确(感谢JavaScript),IDE(Visual Studio,VS代码或NPM打字稿编译器)会抱怨无法在任何导入中找到模块' abc' 。这也意味着这些类没有Intellisense或自动完成支持。
我没有在主项目中创建声明(*.d.ts
)并创建了一个构建任务来将这些声明复制到插件项目中。但他们仍然没有被认出来。 如何让插件项目识别来自声明文件的这些类?
主应用程序有一个类似 core / events.ts 的类。它的DTS可能如下所示:
export declare class Events {
static MY_CONSTANT: string;
}
插件项目有一个插件: Plugins / PluginA / plugin-panel.ts 。它喜欢从 core / events.ts 导入Events
:
import { Events as e1 } from 'core/events';
import { Events as e2 } from 'typings/core/events';
第一行( e1 )就像我在主项目中导入Events
一样,当编译的javascript文件被放入应用程序时它实际上有效。但编译器抱怨它(语义错误)。
第二行( e2 )没有编译器警告但在运行时不正确。
这些打字已经复制到插件/打字/ ,这里是插件/打字/ core / events.d.ts 。只有插件文件夹包含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 ,但这也无济于事。
如何设置import语句在插件开发中的工作原理并在应用程序中部署的项目?
注意:当我在主应用程序加载器配置中添加导入映射时(我config.js
SystemJS
我在这里使用,该行看起来像这样:"typings/core/events": "core/events",
) ,主应用程序可以使用不同的导入路径。但这需要我为主项目中的每个打字稿文件设置映射。
答案 0 :(得分:1)
在研究另一个import
问题时,我发现了这个问题:Absolute module path resolution in TypeScript files in VSCode。请注意,我正在链接到Lekhnath的答案。
显然TypeScript 2.0有一个新的baseUrl
编译器选项,它为具有相对路径的模块设置解析基路径!
所以我可以通过添加到我的compilerOptions
:
"baseUrl": "./Plugins/typings/"
这适用于Visual Studio,命令行编译器和VS Code(请注意,VS Code需要配置设置才能使用项目本地打字稿编译器。)