【问题标题】:How to import a namespace defined in index.d.ts如何导入 index.d.ts 中定义的命名空间
【发布时间】:2019-11-28 21:43:38
【问题描述】:

尝试通过

将 xmlbuilder 导入我的打字稿类
import { xmlbuilder } from "xmlbuilder/typings/index";

我明白了

错误:(2, 10) TS2305: 模块 '../node_modules/xmlbuilder/typings/index"' 没有导出的成员 'xmlbuilder'。

在 index.d.ts (https://github.com/oozcitak/xmlbuilder-js/blob/master/typings/index.d.ts) 中,

export = xmlbuilder;

declare namespace xmlbuilder { 
  ...
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您正在尝试导入类型定义,而不是实际类型。

    您应该使用以下代码:

    import xmlbuilder from "xmlbuilder"
    

    类型定义是向 TypeScript 描述 JavaScript 对象应该是什么样子的简单方法。这使得用 JavaScript 编写的文件可以被 TypeScript 编译器解释,并且可以从 JS 文件中使用用 TypeScript 编写的编译好的 JS 文件。


    如 cmets 中所述,当模块没有默认导出时,您应该使用 别名,导入整个模块。

    import * as xmlbuilder from "xmlbuilder"
    

    这相当于使用require("xmlbuilder")

    【讨论】:

    • 我收到此错误:(2, 8) TS1192: '".../node_modules/xmlbuilder/typings/index"' 没有默认导出。当我从'xmlbuilder'导入xmlbuilder时;
    • import * as xmlbuilder from 'xmlbuilder' 如果模块没有默认导出,可以使用。
    • 正如@JakeHolzinger 所说,如果没有默认导出,您应该为 xmlbuilder 使用 alias。这与使用const xmlbuilder = require("xmlbuilder") 相同。
    • 因为我有一个现有的 XmlBuilder 类。所以我做这个 import * as mybuilder from 'xmlbuilder';但是当我调用 mybuilder.create(..)
    • @SteveL 您正在尝试调用 XmlBuilder 类中的 create 方法。检查您是否没有使用 mybuilder 作为变量名。也许,尝试将mybuilder 换成别的东西。
    【解决方案2】:

    很多人不推荐命名空间,在这种情况下,使用模块定义会更有意义。

    这样写:

    declare module 'xmlbuilder' {
      // export types that describe the module here
    }
    

    现在,当您导入 xmlbuilder 时,它应该会自动具有正确的类型(前提是您已正确配置了 tsconfig)。

    您需要在 tsconfig 中定义自定义 typeRoots(类型声明的目录)的路径。

    有关定义typeRoots 的更多信息可以在here 找到。

    您可以阅读更多关于命名空间和模块声明之间的区别here

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多