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
anamespace
和一个仅导出名称空间的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在这里可能会更智能一些。