我想在我的项目中使用一些.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导入被简单地省略了,因为它未被使用。它确实有效。不过,我想知道这是否是我想做的正确方法。
答案 0 :(得分:0)
我认为你只需要import $ from 'jquery';
(没有大括号),因为导出是你想要的,而不是你只提取一个导出的多个导出的模块。
然后,你打算同时使用两个版本的jquery吗?这些打字不需要处理你不要求打字稿编译器考虑的代码。如果您将$
的一些无冲突版本传入您的打字稿代码,那么像往常一样,您将不得不传递该非全局引用。
该导入还应引入您需要的类型定义,以强烈键入您将传递的JQuery
类型参数。
===
虽然我绝对同情特殊情况的打字和输入打字稿混淆,但我没有按照你想要的确切设置。类型定义不是私有的,因此就typescript而言,类型将随处可用。这与污染运行时全局命名空间不同,d.ts文件不会这样做。这些类型将随处可用来约束您的代码,但它不会给运行时添加任何开销。
风险是$
名称的环境定义,而在运行时,它实际上并不存在 - 以特定方式击败强类型环境的目的。
如果您只说import 'jquery'
并且未定义$
会怎样?我想你仍然可以引用类型来传递一个范围内的,没有冲突的jquery对象,但是也许这些用法不会定义$
?