TypeScript库类型定义

时间:2018-10-28 23:30:26

标签: typescript visual-studio-code typescript-typings

我正在尝试为开放源代码项目(https://github.com/opensourceBIM/BIMserver-JavaScript-API)编写自己的库定义,但是我遇到了麻烦。

我设法克隆了存储库,并为bimserverapipromise.js模块编写了类型,所以现在我有了bimserverapipromise.d.tsgist)并可以编写:

// 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模块导出的一部分?

1 个答案:

答案 0 :(得分:1)

BimServerClient的行为与BimServerApiPromise不同的原因是,您的declare module 'BimServerClient'语句出现在具有顶级导入的文件中,因此被视为模块增强而不是模块声明。您可以通过在import BimServerApiPromise from 'BimServerApiPromise';块内移动declare module 'BimServerClient' { ... }来解决此问题。

但是,更大的问题是,首先声明名为BimServerClientBimServerApiPromise的模块是否正确。除非调用项目设置了一些特殊的模块加载器或捆绑程序配置,否则这些名称将无法在运行时导入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}}字段)。如果您在进口时遇到麻烦,请更新问题,我们很乐意为您提供进一步的帮助。