在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}}标记中使用它们。)
答案 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所期望的呢?