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

Module 为什么环境声明使用名称空间和模块?,module,typescript,Module,Typescript,我注意到许多环境声明文件declareanamespace和一个仅导出名称空间的module,通常使用一些我不太理解的技巧。例如,在中可以看到: declare namespace __React { ... entire API of the react library ... } declare module "react" { export = __React; } 为什么既是名称空间又是模块?为什么不直接声明包含库API的模块呢 为什么名称空间被称为\u Reac

我注意到许多环境声明文件
declare
a
namespace
和一个仅导出名称空间的
module
,通常使用一些我不太理解的技巧。例如,在中可以看到:

declare namespace __React {

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

}

declare module "react" {
    export = __React;
}
  • 为什么既是
    名称空间
    又是
    模块
    ?为什么不直接声明包含库API的模块呢
  • 为什么名称空间被称为
    \u React
    ,而不是简单的
    React
    ?这似乎是一个相当尴尬的“不要使用我”的名字,然而IntelliJ IDEA已经将它导入了我所有的源代码中,并且它似乎可以工作

  • 此模式用于支持

    如果通过
    标记加载,这些库通常会将某些内容放入全局范围,但如果通过模块系统(如RequireJS、CommonJS或SystemJS)调用,则会将某些内容返回给模块加载程序

    在TypeScript中,这意味着如果导入名为
    'react'
    的模块,则应获得与引用全局标识符
    react
    相同的类型


    大多数定义文件只是简单地编写它们的.d.ts文件,这样模块形状和全局变量总是同时存在;React作者不希望您在使用模块加载器时意外引用全局
    React
    (在这种情况下,全局加载器实际上不在那里),因此他们将声明分离为
    \uReact
    ,一个单独的.d.ts文件,该文件声明了一个名为
    React
    的全局,还有一个模块声明,用于
    “react”

    谢谢,这是一个非常清楚的解释,现在一切都有意义了!有趣(恼人)的是,IntelliJ IDEA总是想
    导入组件=\uu React.Component
    而不是
    从“React”
    导入{Component},即使我使用的是
    模块:commonjs
    。对于接口,比如
    import MouseEventHandler=\u React.MouseEventHandler
    ,我想这是因为接口不是编译JS中的引用符号,但是对于其他东西,我得到的
    找不到变量:\u React
    。我想IDE在这里可能会更智能一些。