【发布时间】:2015-09-11 03:08:18
【问题描述】:
我目前正在开展一个项目,在该项目中我使用 Q 库来实现带有 TypeScript 的承诺。
Q 的最新版本有Q.noConflict() 方法。
对于打字,我使用的是来自DefinitelyTyped 存储库的 .d.ts 文件。
打字不支持Q.noConflict()。我尝试了几个小时来重写打字以支持这种方法,但没有成功。
我想使用这样的代码:
var myQ = Q.noConflict();
其中myQ 的类型为Q。但是在 .d.ts 中,Q 是一个具有接口和功能的模块。这意味着我不能简单地添加类似 noConflict(): Q 的内容。
这是定义文件中的架构(不是整个文件,而是所有相关部分):
声明函数Q(value: T): Q.Promise;
declare module Q {
interface IPromise<T> {
then<U>(onFulfill?: (value: T) => U | IPromise<U>, onReject?: (error: any) => U | IPromise<U>): IPromise<U>;
}
interface Deferred<T> {
promise: Promise<T>;
}
interface Promise<T> {
get<U>(propertyName: String): Promise<U>;
}
export function when(): Promise<void>;
export function resolve<T>(object: T): Promise<T>;
}
declare module "q" {
export = Q;
}
当然,我不希望得到完整的代码,但如果能从已经编写了一些 .d.ts 文件的人那里得到一些提示,那就太好了。
【问题讨论】:
-
如果您使用模块,则根本不需要
noConflict。 -
我正在编写的应用程序将被动态加载到页面中,例如谷歌地图。这意味着我不应该覆盖全局变量(因为 Q 是一)。因此我想我必须使用
noConflict。 -
否;这只是意味着您需要包装 IIFE,以便您根本不创建全局变量。模块系统(例如 Browserify)会自动完成。
-
对不起,我不明白。假设我正在将我的应用程序加载到页面中。在这个页面上有 jQuery v2.x 和 Q v0.9。我的代码需要 jQuery v1.x 和 Q v1。然后我需要在加载后首先使用 noConflict() 来释放/设置到以前的全局变量,然后将我的版本传递到我的模块中。
-
没有。您应该通过 Browserify 或类似工具运行所有代码,这样您就不会首先创建任何全局变量。 (而不是直接加载脚本)
标签: javascript typescript q definitelytyped