【问题标题】:TypeScript Definition (d.ts) for Q "noConflict()"Q“noConflict()”的 TypeScript 定义 (d.ts)
【发布时间】: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


【解决方案1】:

使用typeof Q作为返回类型:

declare module Q {
    // ...
    export function noConflict(): typeof Q;
    // ...
}

【讨论】:

  • 这对我有用!谢谢你。如果我这样做,我现在可以使用以下代码:export var q = Q.noConflict(); var promises = new Array&lt;Q.IPromise&lt;void&gt;&gt;(); promises.push(method1); promises.push(method2); return q.all(promises); 因为 TypeScript 编译器会忽略类型声明,所以将“Q.x”用于类型不是问题。
  • 我将这个贡献给了 q.d.ts 的 DefinitiveTyped 项目 github.com/borisyankov/DefinitelyTyped/issues/…
猜你喜欢
  • 2018-09-16
  • 2023-03-17
  • 2017-03-02
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2014-02-10
  • 2017-05-08
相关资源
最近更新 更多