在Typescript 2.x中创建名称空间
我已经(再次)阅读了Typescript的文档来澄清模块和名称空间的问题,但是我仍然有一些不好的地方在Typescript 2.x中创建名称空间,typescript,namespaces,typescript2.0,Typescript,Namespaces,Typescript2.0,我已经(再次)阅读了Typescript的文档来澄清模块和名称空间的问题,但是我仍然有一些不好的地方 声明命名空间Foo{} namespace Foo{} 导出命名空间Foo{} 在这三种创建名称空间的方法中,每种方法的预期用途是什么 假设我想创建一个验证名称空间,我有3个文件用于该名称空间。正确的方法是什么?我将如何从另一个文件/模块导入(使用)验证命名空间中的代码 做这件事的正确方法是什么?我将如何做 是否从其他文件/模块导入(使用)验证命名空间中的代码 当你在一个问题中说“导入(使用)”
声明命名空间Foo{}
namespace Foo{}
导出命名空间Foo{}
导入
和模块无法做到这一点。每个模块都是一个独立的作用域,如果在每个模块中定义名称空间验证
,您将创建3个不同的名称空间,因为来自不同作用域的声明不会合并。好的,您可以通过使用declare global
突破模块范围,但它违背了模块的既定目的-
消除全球化
您可以对非模块的文件执行此操作,即没有任何顶级导入
或导出
的文件。但是,您只能使用非模块化javascript(或typescript)。您的名称空间验证
将在全局范围内,您不能使用导入
和模块,您必须将所有文件编译并连接在一起,生成适合使用
标记加载的单个脚本
另见
至于具体的语法变体
declare namespace Foo {}
这声明存在在某些外部文件(未包含在当前编译中)中定义的命名空间Foo,允许使用Foo
,该命名空间假定包含在{}
中声明的内容(并且{}
可能只包含声明,而不包含此处的定义)
这将创建命名空间Foo
export namespace Foo {}
这也会创建名称空间Foo,但是export
可能有不同的含义,这取决于它在源文件中的位置(这也取决于文件是否是模块,但我不想详细说明export
在没有模块的情况下如何有用)
如果export
处于顶层,它会将文件转换为一个模块,并使Foo
可在其他模块中导入和使用(但不扩展)。如果export
不在顶层,那么它又取决于:如果它在某个导出的名称空间中,它定义了嵌套的名称空间,可由导入该外部名称空间的模块访问。如果它位于非导出名称空间中,export
我相信没有任何效果
export namespace Foo {}