TypeScript中命名空间和模块的区别是什么?

21

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

我知道以前它们被称为内部外部模块,但是两者都可以从其他文件中导入类。那么,真正的区别是什么呢?


3
名称空间和模块名称空间是在全局作用域中包装一组具有唯一名称的函数、变量和对象的机制。这些名称不会与其他作用域中的名称冲突。模块也包含命名的函数、变量和对象,但它们存在于自己的作用域中,并且只能通过明确导入才能访问。TypeScript 支持使用关键字 namespacemodule 来定义名称空间和模块。我们建议尽可能使用模块,因为它们在许多方面都比名称空间更加灵活。要将模块导出,可以使用 export 关键字,然后使用 import 导入模块。另外,还有一种特殊的导入语法,叫做默认导入,默认导入允许为模块指定一个默认输出。 - Nitzan Tomer
据我所知,命名空间曾被称为“模块”,并在 ECMAScript 提出模块标准之前出现在 TypeScript 中。现在,由于 ES 已经有了模块标准,TS 将其“模块”重命名为“命名空间”,并添加了对 ES 模块的支持。我认为,在未来没有任何真正的理由使用命名空间。 - Aaron Beall
2
阅读 @Nitzan Tomer 的“命名空间和模块”使我更加困惑。那么,你认为我必须只使用模块吗? - Mauro Valvano
我不知道你想做什么,所以我无法回答你应该使用什么。我认为那个页面以一种非常直接的方式解释了区别。如果你需要模块来动态加载它们(使用依赖项),并且你使用一个模块加载器(例如 require),那么你需要使用模块。然而,如果你想要具有结构的全局变量,那么你应该使用命名空间。 - Nitzan Tomer
2
很有趣的是,仍然没有一个简单易懂的解释区分它们的差异和应该使用哪个指南。 - tkit
这个回答解决了你的问题吗?TypeScript中内部模块和外部模块有什么区别? - Yogesh Umesh Vaity
2个回答

7
根据 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

如果您使用模块,则必须使用上述“魔法”。


3

当你不想让输出的Javascript代码使用模块加载器时,命名空间是TypeScript结构化代码的方式。

更多关于命名空间和模块的信息可以在手册这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接