将 Typescript 全局变量声明为 "module" 类型

Declare Typescript global variable as "module" type

我有 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。现在我需要打字稿来知道 RReact module.

类型

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

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

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

instead have it as a global

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

全局类型声明

A .d.ts 或声明仅有助于 global 名称声明 space 如果没有根级别 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 将此文件作为依赖项以确保它在您的任何其他代码之前执行。

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

你非常接近(把它放在一个 .d.ts 文件中某个地方 tsc 会找到它):

import * as React from "react";

declare global {
  const R: typeof React;
}

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