【问题标题】:TypeScript library types definitionTypeScript 库类型定义
【发布时间】:2019-04-01 21:10:06
【问题描述】:

我正在尝试为一个开源项目 (https://github.com/opensourceBIM/BIMserver-JavaScript-API) 编写我自己的库定义,但我被卡住了。

我已经成功克隆了 repo,并为 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"
    ]
}

我错过了什么?这是由于bimserverclient.js 模块的多个import/export,或者是因为类型定义仅涵盖了JS 模块导出的一部分?

【问题讨论】:

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


    【解决方案1】:

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

    然而,更大的问题是首先声明名为BimServerClientBimServerApiPromise 的模块是否正确。除非调用项目设置了一些特殊的模块加载器或捆绑器配置,否则这些名称将无法在运行时导入 JavaScript 模块。我建议删除 declare module 语句,并将包含的声明放在文件的顶层。然后任何根据普通 Node.js 模块解析规则解析为 JavaScript 文件之一的导入将自动为 TypeScript 选择相应的 .d.ts 文件。对于您的文件布局,从index.ts 使用的正确相对导入路径将是./BIMServerJavaScriptApi/bimserverclient 和/或./BIMServerJavaScriptApi/bimserverclient.js(取决于您的模块加载器或捆绑器),而如果您要将BIMServerJavaScriptApi 作为npm 包安装在node_modules/bimserverapi,您将使用非相对导入路径bimserverapi/bimserverclient 和/或bimserverapi/bimserverclient.js 或简单地bimserverapi(依赖于mainpackage.json 字段)。如果您在导入时遇到问题,请更新问题,我们很乐意为您提供进一步帮助。

    【讨论】:

    • 成功了,谢谢!所以对于本地开发来说,避免模块定义更容易。但是,如果我想在 DefinitiveTyped 上发布定义怎么办?在这种情况下,我应该使用 module 语法和内部 import 语句,对吧?
    • 在DefiniteTyped 上,您仍然必须构建定义以匹配人们导入实现模块的方式。如果有人导入了bimserverapi/bimserverclient 并且在node_modules/bimserverapi/bimserverclient.js 中找到了实现,那么TypeScript 将查看node_modules/@types/bimserverapi/bimserverclient.d.ts(以及node_modules/bimserverapi/bimserverclient.d.ts)的类型声明。所以如果你创建一个名为@types/bimserverapi 的DefinitelyTyped 包并将bimserverclient.d.ts 放在包的根目录中,那么一切都会正常。
    猜你喜欢
    • 2017-12-21
    • 2021-03-26
    • 2016-06-22
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多