繁体   English   中英

如何强制键入将全局(环境)模块用作外部模块?

[英]How to force typings to use a global (ambient) module as external one?

我想在我的项目中使用一些.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可能应该单独存储,并不能与types.json相对)?

更新:我已经设法将jQuery和其他全局模块转换为外部模块,只需将它们包装在declare module 'module_name' { ... } ,放在我命名为custom_typings的文件夹下,并在其中创建index.d.ts 它可以在我的IDE上正常工作并进行编译。 问题是, tsc在捆绑的amd输出中不包括那些导入。 这很奇怪,因为我在这里遇到了完全相反的问题(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导入而将其忽略了。 它确实有效。 不过,我想知道这是否是执行我想要的正确方法。

我想你只需import $ from 'jquery'; (无括号),因为导出是您想要的,而不是作为多个导出的模块,而您仅从中提取一个。

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

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

===

虽然我完全同意特殊情况下的输入并因打字稿混淆而导入,但我没有遵循您所需要的确切设置。 类型定义不是私有的,就打字稿而言,类型随处可见。 这与污染运行时全局名称空间不同,d.ts文件不会这样做。 这些类型随处可见以约束您的代码,但不会增加运行时的开销。

风险在于为$名称定义环境定义,而在运行时实际上并不会存在-以这种特定方式破坏强类型环境的目的。

如果您只是说import 'jquery'而未定义$什么? 我想您仍然可以引用这些类型来传递有范围的,无冲突的jquery对象,但是也许打字稿不会用这种用法定义$

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM