我注意到许多环境声明文件declare
一个namespace
和一个module
只是导出命名空间,通常使用一些我不做的体操真的明白了例如,在react.d.ts
中,您会看到:
declare namespace __React {
... entire API of the react library ...
}
declare module "react" {
export = __React;
}
namespace
和module
?为什么不在其中声明带有库API的模块?__React
,而不仅仅是React
?这似乎是一个相当尴尬的“不要使用我”的名字,但是IntelliJ IDEA已经在我的源代码中导入了它,它似乎有效。答案 0 :(得分:7)
此模式用于支持UMD libraries。
如果这些库通过<script ...>
标记加载,通常会将某些内容放入全局范围,但如果通过RequireJS,CommonJS或SystemJS等模块系统调用,则会将某些内容返回给模块加载器。
在TypeScript中,这意味着如果import
模块名为'react'
,则应该使用与引用全局标识React
相同的类型。
大多数定义文件只是编写他们的.d.ts文件,这样模块形状和全局变量总是存在;如果你使用模块加载器(在这种情况下全局实际上并不存在),React的作者不喜欢你可能会意外地引用全局React
,因此他们将声明分离为{{1一个单独的.d.ts文件,它声明了一个名为__React
的全局变量,以及一个React
的模块声明。