【发布时间】:2012-10-12 12:38:08
【问题描述】:
我有许多 jQuery 插件,我想在 TypeScript 中使用 AMD 模式加载它们。例如,我可能有这样的结构:
/lib/jquery.myplugin.js
/app.ts
该插件只是扩展了 jQuery。它没有提供新的顶级函数或变量。一个例子可能是:
// jquery.myplugin.js
jQuery.fn.myExample = function() { ... }
对应的 jquery.myplugin.d.ts 文件如下:
interface JQuery {
myExample();
}
所以现在在 app.ts 中我可以调用类似 $('#my-element').myExample() 的东西。请注意,这假设我已经加载了 Microsoft 的 jquery.d.ts 声明。
我的问题是如何异步加载这个库并利用 TypeScripts 静态类型?我可以这样使用它:
/// <reference path="lib/jquery.myplugin.d.ts"/>
但这需要我在我的 HTML 中添加一个 <script> 标记,并且该库不是异步加载的。我希望 TypeScript 生成此代码:
define(["require", "exports", "lib/jquery.myplugin"], function (require, exports, __jquery.myplugin__) {
...
// Use my plugin
$('#my-element').myExample();
}
但是,由于 .d.ts 文件中没有导出,我无法编写 import myplugin = module('lib/jquery.myplugin')。
我得到的最接近的方法是创建一个jquery.myplugin.d.ts,它引用另一个带有接口声明的 ts 文件,并且至少包含一个导出。然而,在这个库中没有什么要导出的,为了获得所需的输出,我不仅要添加一个导出,而且我必须调用它。
更新:我在typescript.codeplex.com上为此打开了work item
【问题讨论】:
-
我当前的解决方法是在我的 TypeScript 代码中手动调用
require([...], () => { ... }),这会生成嵌套的 require 调用。远非理想,但它确实有效。
标签: javascript typescript js-amd