【问题标题】:Why do ambient declarations use namespace and module?为什么环境声明使用命名空间和模块?
【发布时间】:2016-06-06 00:54:03
【问题描述】:

我注意到许多环境声明文件 declarenamespace 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 已将它导入到我的源代码中,而且它似乎可以工作。

【问题讨论】:

    标签: module typescript


    【解决方案1】:

    此模式用于支持UMD libraries

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

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

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

    【讨论】:

    • 谢谢,这是一个非常清楚的解释,现在一切都说得通了!有趣(烦人)的是 IntelliJ IDEA 总是想要 import Component = __React.Component 而不是 import {Component} from "react",即使我使用的是 module: commonjs。对于接口,比如import MouseEventHandler = _React.MouseEventHandler,它可以工作,我猜是因为接口不是编译的 JS 中的引用符号,但对于其他事情我得到Can't find variable: __React。我想这里的 IDE 可能会更聪明一些。
    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 2016-07-17
    • 1970-01-01
    • 2016-12-15
    • 2015-01-07
    • 1970-01-01
    • 2012-11-08
    • 2015-02-01
    相关资源
    最近更新 更多