我有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?
无法执行此操作,因为在将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
。
npm install ramda @types/ramda
typings/ramda.d.ts
typings
文件夹添加到.tsconfig.json中的include中:"include": [
"typings/**/*",
...
]
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谢谢你,这非常有帮助
最有用的评论
嗨@Evertt确实我现在也收到此错误。 最初,我的源代码没有使用ES6模块语法,但是一旦我将某些文件重构为该语法,我就会遇到相同的错误。 做了一些研究,现在对我有用的是,当我创建第二个文件
globals.d.ts
并将其也放入typesings文件夹中时:实际上,仅此文件似乎就可以“满足”打字稿编译器的要求,因此从理论上讲,您不需要我之前提到的其他文件。 但是,在我的特定情况下(我正在使用WebStorm),当仅具有globals.d.ts文件时,我的IDE会不断ping我以导入模块,并且这些全局变量的完成也不完整。 因此,我现在基本上将两个文件都保存在可以满足打字稿和我的IDE的类型目录中。 并不是很好,但是对于一个通常使用的少数全局变量,我想可以保留这些文件。
这是我的
tsconfig.json
供参考:我没有使用webpack或任何捆绑包。 我只是转译单个文件,然后通过https://github.com/SAP/openui5模块系统(与AMD类似)加载它们,并将它们捆绑在一起仅用于生产。
打字稿版本是:2.2.1
希望能有所帮助。