我正在尝试为开放源代码项目(https://github.com/opensourceBIM/BIMserver-JavaScript-API)编写自己的库定义,但是我遇到了麻烦。
我设法克隆了存储库,并为bimserverapipromise.js
模块编写了类型,所以现在我有了bimserverapipromise.d.ts
(gist)并可以编写:>
// index.ts
import BimServerApiPromise from "BimServerApiPromise";
let x = new BimServerApiPromise();
麻烦始于bimserverclient.js
模块,该模块无法使用相同的方法:我用定义(gist)创建了bimserverclient.d.ts
,但是编译器似乎无法加载模块。
// index.ts
import BimServerClient from "BimServerClient"; // VSCode error: module not found
let y = new BimServerClient();
项目的文件夹结构为:
|- /index.ts
|- /tsconfig.json
|_ /BIMServerJavaScriptApi/bimserverclient.d.ts
|_ /BIMServerJavaScriptApi/bimserverclient.js
|_ /BIMServerJavaScriptApi/bimserverapipromise.d.ts
|_ /BIMServerJavaScriptApi/bimserverapipromise.js
|_ /BIMServerJavaScriptApi/** other files **
tsconfig.json
如下:
{
"compileOnSave": true,
"compilerOptions": {
"module": "commonjs",
"allowJs": false,
"sourceMap": true,
"listFiles": true,
"target": "es5",
"lib": ["es2016", "dom"]
},
"include": [
"./**/*.ts"
]
}
我想念什么?是由于import/export
模块的多个bimserverclient.js
引起的,还是因为类型定义仅覆盖JS模块导出的一部分?
答案 0 :(得分:1)
BimServerClient
的行为与BimServerApiPromise
不同的原因是,您的declare module 'BimServerClient'
语句出现在具有顶级导入的文件中,因此被视为模块增强而不是模块声明。您可以通过在import BimServerApiPromise from 'BimServerApiPromise';
块内移动declare module 'BimServerClient' { ... }
来解决此问题。
但是,更大的问题是,首先声明名为BimServerClient
和BimServerApiPromise
的模块是否正确。除非调用项目设置了一些特殊的模块加载器或捆绑程序配置,否则这些名称将无法在运行时导入JavaScript模块。我建议删除declare module
语句,然后将包含的声明放在文件的顶层。然后,根据正常的Node.js模块解析规则解析为JavaScript文件之一的任何导入都将自动为TypeScript选择相应的.d.ts
文件。对于您的文件布局,要从index.ts
使用的正确相对导入路径将是./BIMServerJavaScriptApi/bimserverclient
和/或./BIMServerJavaScriptApi/bimserverclient.js
(取决于模块加载程序或捆绑程序),而如果要安装{ {1}}作为BIMServerJavaScriptApi
处的npm软件包,您将使用非相对导入路径node_modules/bimserverapi
和/或bimserverapi/bimserverclient
或简单地使用bimserverapi/bimserverclient.js
(依赖于{{ bimserverapi
的1}}字段)。如果您在进口时遇到麻烦,请更新问题,我们很乐意为您提供进一步的帮助。