Typescript: 允许将模块定义声明为全局变量

创建于 2015-05-15  ·  11评论  ·  资料来源: microsoft/TypeScript

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

import * as R from "react"

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

let _r = R;
_r.createElement(...

我想要的是不必在每个文件中导入R,而是将其作为全局声明使用(是的,我愿意用几个变量来污染全局名称空间)。 我已经尝试过,在.d.ts

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

但是,这不起作用,我收到“找不到名称'React'”。 是否有另一种方法可以将整个模块导出为全局模块,而无需修改底层的react.d.ts?

Question

最有用的评论

@Evertt确实我现在也收到此错误。 最初,我的源代码没有使用ES6模块语法,但是一旦我将某些文件重构为该语法,我就会遇到相同的错误。 做了一些研究,现在对我有用的是,当我创建第二个文件globals.d.ts并将其也放入typesings文件夹中时:

import * as _R from 'ramda';
import * as _mobx from 'mobx';

declare global {
  const R: typeof _R;
  const mobx: typeof _mobx;
}

实际上,仅此文件似乎就可以“满足”打字稿编译器的要求,因此从理论上讲,您不需要我之前提到的其他文件。 但是,在我的特定情况下(我正在使用WebStorm),当仅具有globals.d.ts文件时,我的IDE会不断ping我以导入模块,并且这些全局变量的完成也不完整。 因此,我现在基本上将两个文件都保存在可以满足打字稿和我的IDE的类型目录中。 并不是很好,但是对于一个通常使用的少数全局变量,我想可以保留这些文件。

这是我的tsconfig.json供参考:

{
  "compilerOptions": {
    "target": "ES5",
    "module": "amd",
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "lib": [
      "ES6",
      "DOM",
      "ScriptHost"
    ],
    "sourceMap": true,
    "strictNullChecks": true
  },
  "include": [
    "types/**/*",
    "src/**/*"
  ]
}

我没有使用webpack或任何捆绑包。 我只是转译单个文件,然后通过https://github.com/SAP/openui5模块系统(与AMD类似)加载它们,并将它们捆绑在一起仅用于生产。

打字稿版本是:2.2.1

希望能有所帮助。

所有11条评论

无法执行此操作,因为在将import声明添加到源文件的那一刻,它被视为外部模块。 您不使用不使用全局变量的React定义文件的任何原因是什么?

https://github.com/borisyankov/DefinitelyTyped/blob/master/react/react-global.d.ts

在我看来这样可以解决问题。

我实际上也尝试了react-global.d.ts ,这显然会将React放到全局空间中,但是我将如何对其进行全局重命名并让Typescript知道呢?

declare var _r = React;  // error Cannot find name 'React';

我真正的用例是能够将实用程序/通用类型的模块提升到全局空间,因此我不必使用一堆相对路径导入就可以到达它。 我可以用Javascript做到这一点,但是我在如何让Typescript编译器知道自己已经做到这一点上苦苦挣扎。

@ahejlsberg-我敢肯定,您要做的工作还不止是在

例如,您可以创建r.d.ts声明文件:

/// <reference path="react-global.d.ts"/>
declare var R: typeof React;

然后随处引用该文件。 甚至更好:

/// <reference path="react-global.d.ts"/>
import R = React;

这将使您也可以将React中的类型引用为R.xxx。

我以前从未看过typeof的用法-很酷。 这对于从.d.ts已定义的模块非常有用,但是我仍然看不到将Typescript中定义的外部模块提升到全局空间并使Typescript知道的方法。 也许因为这是反模式,我应该克服它...

我们已经有一些请求(例如#2357)来扩展typeof以支持外部模块,但是到目前为止,对该功能的需求并不多。

一般而言,编写程序时可以不使用外部模块,也可以仅使用外部模块。 除了AMD浏览器应用程序的引导程序部分之外,实际上没有执行环境甚至可以实现混合模型。 是的,这主要是一种反模式。

感谢您抽出宝贵的时间在此方面使我幽默! 我刚刚开始探索外部模块(与即将推出的Angular2和Aurelia框架一起使用)。 诸如#17,#2338和#2839之类的问题似乎最终是我要寻找的。 希望我在深入研究当前项目时能得到更清晰的反馈。

这还是不可能吗? 我正在尝试将TypeScript与VueJS一起使用,如果能将一些内容导入到全局名称空间中,以便所有组件都可以使用它而不必导入这些内容,我将不胜感激。 有没有进展或黑客使这项工作进行?

@Evertt

我发现了一种显然适用于打字稿2.xx的方式。在我的情况下,我想将库ramda公开为全局R

  1. npm install ramda @types/ramda
  2. 创建文件typings/ramda.d.ts
  3. 将新创建的typings文件夹添加到.tsconfig.json中的include中:
"include": [
    "typings/**/*",
     ...
]
  1. 将魔术添加到typings/ramda.d.ts
import * as _R from 'ramda';

export as namespace R;
export = _R; 

现在,我项目中的所有ts文件都假定存在类型化的全局R而无需我进行进一步的导入或这些文件中的任何操作。

@geekflyer当我尝试在我的types/vue.d.ts中使用以下代码进行操作时:

import * as V from 'vue'

export as namespace Vue
export = V

每当我尝试在某处使用该全局Vue时,都会出现以下错误:

error TS2686: 'Vue' refers to a UMD global, but the current file is a module. Consider adding an import instead.

您是否在某个时候也收到了该错误? 如果是这样,您对此做了什么?

编辑

如果您没有收到该错误,并且不确定为什么我会收到该错误,您是否愿意向我展示您的整个tsconfig.json甚至您的webpack配置?

@Evertt确实我现在也收到此错误。 最初,我的源代码没有使用ES6模块语法,但是一旦我将某些文件重构为该语法,我就会遇到相同的错误。 做了一些研究,现在对我有用的是,当我创建第二个文件globals.d.ts并将其也放入typesings文件夹中时:

import * as _R from 'ramda';
import * as _mobx from 'mobx';

declare global {
  const R: typeof _R;
  const mobx: typeof _mobx;
}

实际上,仅此文件似乎就可以“满足”打字稿编译器的要求,因此从理论上讲,您不需要我之前提到的其他文件。 但是,在我的特定情况下(我正在使用WebStorm),当仅具有globals.d.ts文件时,我的IDE会不断ping我以导入模块,并且这些全局变量的完成也不完整。 因此,我现在基本上将两个文件都保存在可以满足打字稿和我的IDE的类型目录中。 并不是很好,但是对于一个通常使用的少数全局变量,我想可以保留这些文件。

这是我的tsconfig.json供参考:

{
  "compilerOptions": {
    "target": "ES5",
    "module": "amd",
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "lib": [
      "ES6",
      "DOM",
      "ScriptHost"
    ],
    "sourceMap": true,
    "strictNullChecks": true
  },
  "include": [
    "types/**/*",
    "src/**/*"
  ]
}

我没有使用webpack或任何捆绑包。 我只是转译单个文件,然后通过https://github.com/SAP/openui5模块系统(与AMD类似)加载它们,并将它们捆绑在一起仅用于生产。

打字稿版本是:2.2.1

希望能有所帮助。

@geekflyer谢谢你,这非常有帮助

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Antony-Jones picture Antony-Jones  ·  3评论

Roam-Cooper picture Roam-Cooper  ·  3评论

kyasbal-1994 picture kyasbal-1994  ·  3评论

wmaurer picture wmaurer  ·  3评论

MartynasZilinskas picture MartynasZilinskas  ·  3评论