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

Aar*_*all 3 module typescript

我注意到许多环境声明文件declarea namespace a module只是导出命名空间,通常使用一些我不太懂的体操.例如,react.d.ts你看到这个:

declare namespace __React {

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

}

declare module "react" {
    export = __React;
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么a namespace和a module?为什么不在其中声明带有库API的模块呢?
  2. 为什么名称空间被调用__React而不是简单React?这似乎是一个相当尴尬的"不要使用我"的名称,但IntelliJ IDEA已经在我的源代码中导入了它,它似乎工作.

Rya*_*ugh 7

此模式用于支持UMD库.

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

在TypeScript中,这意味着如果您import调用了模块'react',则应该获得与引用全局标识符相同的类型React.

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