在TypeScript模块中定义全局命名空间/变量

时间:2015-11-23 07:45:08

标签: module namespaces typescript global webpack

在TypeScript中,我可以定义一个全局/顶级命名空间,并在另一个文件中使用它,如下所示:

foo.blah.baz();

在另一个文件中,这有效:

import Thing from 'boo';

namespace foo.blah {
    export function baz() {
        console.log('hello');
    }
}

然而,如果我然后从另一个模块导入一些东西:

foo.blah

突然我的整个文件是一个模块,foo.blah.baz()命名空间是本地的,而不是全局的,而另一个文件中的export namespace ...调用失败。 import Thing from 'boo'; import * as $ from 'jquery'; namespace foo.blah { export function baz() { console.log('hello'); } } $.extend(true, window, {foo}); 只会使命名空间成为模块导出的一部分,而不是全局。

有没有办法编写从其他模块导入但也定义全局/顶级符号的TypeScript文件?

目前我正在这样做:

foo.blah...

哪个有效,但TypeScript编译器仍然无法看到<script>作为其他文件中的全局存在。

(该文件是Webpack的入口点,我尝试从Webpack包中的其他模块导入内容并将它们分配给全局变量,以便可以在页面上的{{1}}标记中使用它们。)

2 个答案:

答案 0 :(得分:2)

解决方案是在全局中声明命名空间。

declare global {
  namespace foo.blah {
     function baz() {
       console.log('hello');
     }
  }
}

答案 1 :(得分:1)

当您添加import时,您可以从内部模块切换到外部模块,如规范所述:

  

在外部模块中,指定文件之间的关系   文件一级的进口和出口条款。在TypeScript中,任何   包含顶级导入或导出的文件被视为外部文件   模块。

http://www.typescriptlang.org/Handbook#modules-going-external

外部模块背后的理念是避免使用全局对象,为什么不用foo.blah创建一个新模块(以及所需的所有东西)并将其导入为TypeScript所期望的呢?