【问题标题】:What is the difference between namespaces and modules in typescript打字稿中的命名空间和模块有什么区别
【发布时间】:2016-09-04 07:00:04
【问题描述】:

我已经使用 typescript 几个月了,但我还没有理解命名空间和模块的区别。

我知道在它们被命名为 internalexternal 模块之前,我可以从其他文件中导入类。那么真正的区别是什么?

【问题讨论】:

  • 据我了解,命名空间过去被称为“模块”,并且在 ECMAScript 提出模块标准之前就出现在 TypeScript 中。现在 ES 有一个模块标准,TS 将它们的“模块”重命名为“命名空间”并添加了对 ES 模块的支持。我认为没有任何真正的理由继续使用命名空间。
  • 阅读@Nitzan Tomer 的“命名空间和模块”让我更加困惑。那么,你认为我必须只使用模块吗?
  • 我不知道你想做什么,所以我无法回答你应该使用什么。我认为该页面以非常直接的方式解释了差异。如果您需要动态加载模块(使用依赖项)并且使用模块加载器(例如需要),那么您需要使用模块。但是,如果您想拥有具有结构的全局变量,那么您应该使用命名空间。
  • 有趣的是,仍然没有一个简单易懂的差异解释和一个应该使用的指南。

标签: module typescript namespaces


【解决方案1】:

当您不希望输出的 Javascript 代码使用模块加载器时,命名空间是 TypeScript 构建代码的方式。

您可以在手册 here 中找到有关命名空间与模块的更多信息。

【讨论】:

    【解决方案2】:

    正如TS-handbook 中所述 有两种模块:“内部”和“外部”。内部模块中的代码是用 Typescript 编写的,而“外部”是用 Javascript 编写的。

    为了与ECMAScript 2015 的新术语保持一致,他们决定将其重命名如下:

    1. “内部模块”现在是“命名空间”。
    2. “外部模块”现在只是“模块”,以便与 ECMAScript 保持一致

    所以:

    • 编写代码的方式不同
    • 使用模块时,类不会在全局范围内公开,而使用命名空间时:

    示例:

    假设您有公共命名空间序列NamespaceA.NamespaceB.NamespaceC,它公开了公共类ClassD。 您可以通过这种方式在全球范围内访问所有这些:

    window.NamespaceA
    window.NamespaceA.NamespaceB
    window.NamespaceA.NamespaceB.NamespaceC
    window.NamespaceA.NamespaceB.NamespaceC.ClassD
    

    不用说window.NamespaceA = NamespaceA

    如果你使用模块,你必须使用上面的“魔法”

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 1970-01-01
      • 2019-09-13
      • 2017-11-13
      • 1970-01-01
      • 2014-08-10
      • 2011-06-26
      • 2012-07-10
      • 1970-01-01
      相关资源
      最近更新 更多