如何强制打字使用全局(环境)模块作为外部模块?

时间:2016-11-04 16:33:21

标签: javascript typescript typescript-typings

我想在我的项目中使用一些.d.ts定义,让我们说,jQuery。我希望像这样(或以类似的方式)包含它

import {$} from 'jquery';

并没有在全局范围内(在我的实际用例中存在大量名称冲突)。

但是dt~jquery是一个全球模块。显然,我收到了一个错误:

> typings install dt~jquery --save

typings ERR! message Attempted to compile "jquery" as an external module,
  but it looks like a global module. You'll need to enable the global option to continue.

可以typings自动将其包裹在declare module中(为什么不会)?如果没有,那么手动执行此操作的常规方法是什么,以便我的存储库贡献者不必担心它?

我认为需要本地修改的.d.ts副本。如果是这样,它应该放在哪里(我的typings目录是.gitignored,所以自定义.d.ts应该单独存储并从typings.json中反映出来)?

更新:我刚刚设法将jQuery和其他全局模块转换为外部模块,只需将每个模块包装在declare module 'module_name' { ... }中,放在我命名为custom_typings的文件夹下并创建index.d.ts有参考。它适用于我的IDE和编译。问题是,tsc不包括我的捆绑amd输出中的导入。这很奇怪,因为我遇到了完全相反的问题here(tsc包含js输出中的外部.d.ts导入,这使webpack混乱)。

// modified_jquery_typing.d.ts
declare module 'jquery' {
  ...code from DefinitelyTyped...

  export var jQuery: JQueryStatic;
}

// app.ts
import {thing} from 'actual_ts_file';
import {jQuery} from 'jquery';

// app.js contains .ts import but not .d.ts
define("app", ["require", "exports", "actual_ts_file"], ...)

UPDATE(2):这是愚蠢的,jQuery导入被简单地省略了,因为它未被使用。它确实有效。不过,我想知道这是否是我想做的正确方法。

1 个答案:

答案 0 :(得分:0)

我认为你只需要import $ from 'jquery';(没有大括号),因为导出是你想要的,而不是你只提取一个导出的多个导出的模块。

然后,你打算同时使用两个版本的jquery吗?这些打字不需要处理你不要求打字稿编译器考虑的代码。如果您将$的一些无冲突版本传入您的打字稿代码,那么像往常一样,您将不得不传递该非全局引用。

该导入还应引入您需要的类型定义,以强烈键入您将传递的JQuery类型参数。

===

虽然我绝对同情特殊情况的打字和输入打字稿混淆,但我没有按照你想要的确切设置。类型定义不是私有的,因此就typescript而言,类型将随处可用。这与污染运行时全局命名空间不同,d.ts文件不会这样做。这些类型将随处可用来约束您的代码,但它不会给运行时添加任何开销。

风险是$名称的环境定义,而在运行时,它实际上并不存在 - 以特定方式击败强类型环境的目的。

如果您只说import 'jquery'并且未定义$会怎样?我想你仍然可以引用类型来传递一个范围内的,没有冲突的jquery对象,但是也许这些用法不会定义$