为什么环境声明使用命名空间和模块?

时间:2016-02-23 23:17:24

标签: module typescript

我注意到许多环境声明文件declare一个namespace 一个module只是导出命名空间,通常使用一些我不做的体操真的明白了例如,在react.d.ts中,您会看到:

declare namespace __React {

    ... entire API of the react library ...

}

declare module "react" {
    export = __React;
}
  1. 为什么同时为namespacemodule?为什么不在其中声明带有库API的模块?
  2. 为什么命名空间名为__React,而不仅仅是React?这似乎是一个相当尴尬的“不要使用我”的名字,但是IntelliJ IDEA已经在我的源代码中导入了它,它似乎有效。

1 个答案:

答案 0 :(得分:7)

此模式用于支持UMD libraries

如果这些库通过<script ...>标记加载,通常会将某些内容放入全局范围,但如果通过RequireJS,CommonJS或SystemJS等模块系统调用,则会将某些内容返回给模块加载器。

在TypeScript中,这意味着如果import模块名为'react',则应该使用与引用全局标识React相同的类型。

大多数定义文件只是编写他们的.d.ts文件,这样模块形状和全局变量总是存在;如果你使用模块加载器(在这种情况下全局实际上并不存在),React的作者不喜欢你可能会意外地引用全局React,因此他们将声明分离为{{1一个单独的.d.ts文件,它声明了一个名为__React的全局变量,以及一个React的模块声明。