【问题标题】:Declare Typescript global variable as "module" type将 Typescript 全局变量声明为“模块”类型
【发布时间】:2015-07-25 00:53:27
【问题描述】:

我有 React 类型定义文件(使用外部模块声明)。在我的源文件中,我通常会这样做:

import * as R from "react"

然后可以愉快地以强类型方式使用R.createElement(...等。

我想要的是不必在每个文件中都导入R,而是将其作为全局声明(是的,我愿意用一些变量来污染全局命名空间)。我试过了:

import * as React from "react";
declare var R : React;

但这不起作用,我得到"Cannot find name 'React'"。还有其他方法可以将整个模块导出为全局吗?


编辑 1 - 我应该更清楚一点:我对如何在.d.ts 文件中导出全局类型定义 感兴趣。所以假设我已经将R 附加到window。现在我需要打字稿才能知道R 的类型是React module

【问题讨论】:

    标签: typescript typescript1.5


    【解决方案1】:

    而是将其作为一个全局变量

    这有两个方面:global type declaration 用于打字稿,global variable availability 用于 JavaScript 消费。

    全局类型声明

    .d.ts 或声明仅在没有根级别 importexport 的情况下才有助于文件。所以有一个文件globalreact.d.ts,它将是https://github.com/borisyankov/DefinitelyTyped/blob/master/react/react.d.ts编辑 版本,形式为declare module R(而不是declare module "react")。

    全局变量导出

    如果是浏览器,您需要将其放在window 上。所以在文件makeReactGlobal.ts 中执行以下操作:

    var R = require('react'); 
    (<any>window).R = R
    

    然后在您的应用程序main 中为该文件添加一个依赖项,以确保它在您的任何其他代码之前执行。

    【讨论】:

    • 感谢您提供所有详细信息。我对全局类型声明部分感兴趣,并且真的希望不必破解 react.d.ts 文件。看到打字稿会理解import * as R from 'react'; var _r = R; 我真的想要一种方法将其放入.d.ts 文件中。
    • 考虑到定义是如何写在 atm 上的,AFAIK 在技术上是不可能的。
    • 我把它发给了 Typescript 团队——看起来不可能:github.com/Microsoft/TypeScript/issues/…
    • 标记为答案,即使没有答案:(
    【解决方案2】:

    declare 关键字不在全局范围内声明变量。此关键字用于全局范围内将存在变量并且您希望在 TypeScript 中使用它而不会出现编译错误的情况。

    你可以声明一个全局变量:

    import * as R from "react";
    window.R = R;
    

    【讨论】:

    • 感谢您的回答——这就是您在 javascript 端公开它的方式。我正在尝试公开输入本身(请参阅下面的@basarat 答案)。
    【解决方案3】:

    就像@basarat 所说,这看起来不太可能。 @ahejlsberg 本人在 github 上对这个问题进行了权衡:https://github.com/Microsoft/TypeScript/issues/3180#issuecomment-102523512

    【讨论】:

      【解决方案4】:

      你已经很接近了(把它放在一个 .d.ts 文件中 tsc 会找到它的地方):

      import * as React from "react";
      
      declare global {
        const R: typeof React;
      }
      

      (注意添加的“typeof”。尚未使用 React 进行测试,但它适用于 Vue。)

      【讨论】:

        猜你喜欢
        • 2019-01-04
        • 2018-09-06
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2017-07-25
        • 1970-01-01
        相关资源
        最近更新 更多