在Typescript 2.x中创建名称空间

在Typescript 2.x中创建名称空间,typescript,namespaces,typescript2.0,Typescript,Namespaces,Typescript2.0,我已经(再次)阅读了Typescript的文档来澄清模块和名称空间的问题,但是我仍然有一些不好的地方 声明命名空间Foo{} namespace Foo{} 导出命名空间Foo{} 在这三种创建名称空间的方法中,每种方法的预期用途是什么 假设我想创建一个验证名称空间,我有3个文件用于该名称空间。正确的方法是什么?我将如何从另一个文件/模块导入(使用)验证命名空间中的代码 做这件事的正确方法是什么?我将如何做 是否从其他文件/模块导入(使用)验证命名空间中的代码 当你在一个问题中说“导入(使用)”

我已经(再次)阅读了Typescript的文档来澄清模块和名称空间的问题,但是我仍然有一些不好的地方

  • 声明命名空间Foo{}
  • namespace Foo{}
  • 导出命名空间Foo{}
  • 在这三种创建名称空间的方法中,每种方法的预期用途是什么

    假设我想创建一个验证名称空间,我有3个文件用于该名称空间。正确的方法是什么?我将如何从另一个文件/模块导入(使用)验证命名空间中的代码

    做这件事的正确方法是什么?我将如何做 是否从其他文件/模块导入(使用)验证命名空间中的代码

    当你在一个问题中说“导入(使用)”和“文件/模块”时,你问的是两种截然不同的情况,每种情况的答案都不一样

    使用
    导入
    和模块无法做到这一点。每个模块都是一个独立的作用域,如果在每个模块中定义
    名称空间验证
    ,您将创建3个不同的名称空间,因为来自不同作用域的声明不会合并。好的,您可以通过使用
    declare global
    突破模块范围,但它违背了模块的既定目的- 消除全球化

    您可以对非模块的文件执行此操作,即没有任何顶级
    导入
    导出
    的文件。但是,您只能使用非模块化javascript(或typescript)。您的
    名称空间验证
    将在全局范围内,您不能使用
    导入
    和模块,您必须将所有文件编译并连接在一起,生成适合使用
    标记加载的单个脚本

    另见

    至于具体的语法变体

    declare namespace Foo {}
    
    这声明存在在某些外部文件(未包含在当前编译中)中定义的命名空间Foo,允许使用
    Foo
    ,该命名空间假定包含在
    {}
    中声明的内容(并且
    {}
    可能只包含声明,而不包含此处的定义)

    这将创建命名空间
    Foo

    export namespace Foo {}
    
    这也会创建名称空间Foo,但是
    export
    可能有不同的含义,这取决于它在源文件中的位置(这也取决于文件是否是模块,但我不想详细说明
    export
    在没有模块的情况下如何有用)

    如果
    export
    处于顶层,它会将文件转换为一个模块,并使
    Foo
    可在其他模块中导入和使用(但不扩展)。如果
    export
    不在顶层,那么它又取决于:如果它在某个导出的名称空间中,它定义了嵌套的名称空间,可由导入该外部名称空间的模块访问。如果它位于非导出名称空间中,
    export
    我相信没有任何效果

    export namespace Foo {}