diff --git a/jquery/jquery-tests.ts b/jquery/jquery-tests.ts index fbee85509f..01f75a9855 100644 --- a/jquery/jquery-tests.ts +++ b/jquery/jquery-tests.ts @@ -940,8 +940,7 @@ function test_deferred() { filtered.done(function (data) { }); function asyncEvent() { - var newDeferred = new jQuery.Deferred(); - var dfd: JQueryDeferred; + var dfd: JQueryDeferred = $.Deferred(); setTimeout(function () { dfd.resolve("hurray"); }, Math.floor(400 + Math.random() * 2000)); diff --git a/jquery/jquery.d.ts b/jquery/jquery.d.ts index c66b283f81..c2f9f47ddb 100644 --- a/jquery/jquery.d.ts +++ b/jquery/jquery.d.ts @@ -57,7 +57,7 @@ interface JQueryAjaxSettings { /* Interface for the jqXHR object */ -interface JQueryXHR extends XMLHttpRequest, JQueryPromise { +interface JQueryXHR extends XMLHttpRequest, JQueryPromise { overrideMimeType(mimeType: string); abort(statusText?: string): void; } @@ -78,33 +78,61 @@ interface JQueryCallback { remove(...callbacks: any[]): any; } +/* + Allows jQuery Promises to interop with non-jQuery promises +*/ +interface JQueryGenericPromise { + then(onFulfill: (value: T) => U, onReject?: (reason) => U): JQueryGenericPromise; + then(onFulfill: (value: T) => JQueryGenericPromise, onReject?: (reason) => U): JQueryGenericPromise; + then(onFulfill: (value: T) => U, onReject?: (reason) => JQueryGenericPromise): JQueryGenericPromise; + then(onFulfill: (value: T) => JQueryGenericPromise, onReject?: (reason) => JQueryGenericPromise): JQueryGenericPromise; +} + /* Interface for the JQuery promise, part of callbacks */ -interface JQueryPromise { - always(...alwaysCallbacks: any[]): JQueryDeferred; - done(...doneCallbacks: any[]): JQueryDeferred; - fail(...failCallbacks: any[]): JQueryDeferred; - pipe(doneFilter?: (x: any) => any, failFilter?: (x: any) => any, progressFilter?: (x: any) => any): JQueryPromise; - then(doneCallbacks: any, failCallbacks?: any, progressCallbacks?: any): JQueryDeferred; +interface JQueryPromise { + always(...alwaysCallbacks: any[]): JQueryPromise; + done(...doneCallbacks: any[]): JQueryPromise; + fail(...failCallbacks: any[]): JQueryPromise; + progress(...progressCallbacks: any[]): JQueryPromise; + + // Deprecated - given no typings + pipe(doneFilter?: (x: any) => any, failFilter?: (x: any) => any, progressFilter?: (x: any) => any): JQueryPromise; + + then(onFulfill: (value: T) => U, onReject?: (...reasons) => U, onProgress?: (...progression) => any): JQueryPromise; + then(onFulfill: (value: T) => JQueryGenericPromise, onReject?: (...reasons) => U, onProgress?: (...progression) => any): JQueryPromise; + then(onFulfill: (value: T) => U, onReject?: (...reasons) => JQueryGenericPromise, onProgress?: (...progression) => any): JQueryPromise; + then(onFulfill: (value: T) => JQueryGenericPromise, onReject?: (...reasons) => JQueryGenericPromise, onProgress?: (...progression) => any): JQueryPromise; + + /* Because JQuery Promises Suck */ + then(onFulfill: (...args) => U, onReject?: (...reasons) => U, onProgress?: (...progression) => any): JQueryPromise; + then(onFulfill: (...args) => JQueryGenericPromise, onReject?: (...reasons) => U, onProgress?: (...progression) => any): JQueryPromise; + then(onFulfill: (...args) => U, onReject?: (...reasons) => JQueryGenericPromise, onProgress?: (...progression) => any): JQueryPromise; + then(onFulfill: (...args) => JQueryGenericPromise, onReject?: (...reasons) => JQueryGenericPromise, onProgress?: (...progression) => any): JQueryPromise; } /* Interface for the JQuery deferred, part of callbacks */ -interface JQueryDeferred extends JQueryPromise { - notify(...args: any[]): JQueryDeferred; - notifyWith(context: any, ...args: any[]): JQueryDeferred; +interface JQueryDeferred extends JQueryPromise { + always(...alwaysCallbacks: any[]): JQueryDeferred; + done(...doneCallbacks: any[]): JQueryDeferred; + fail(...failCallbacks: any[]): JQueryDeferred; + progress(...progressCallbacks: any[]): JQueryDeferred; - pipe(doneFilter?: any, failFilter?: any, progressFilter?: any): JQueryPromise; - progress(...progressCallbacks: any[]): JQueryDeferred; - reject(...args: any[]): JQueryDeferred; - rejectWith(context: any, ...args: any[]): JQueryDeferred; - resolve(...args: any[]): JQueryDeferred; - resolveWith(context: any, ...args: any[]): JQueryDeferred; + notify(...args: any[]): JQueryDeferred; + notifyWith(context: any, ...args: any[]): JQueryDeferred; + + reject(...args: any[]): JQueryDeferred; + rejectWith(context: any, ...args: any[]): JQueryDeferred; + + resolve(val: T): JQueryDeferred; + resolve(...args: any[]): JQueryDeferred; + resolveWith(context: any, ...args: any[]): JQueryDeferred; state(): string; - then(doneCallbacks: any, failCallbacks?: any, progressCallbacks?: any): JQueryDeferred; - promise(target?: any): JQueryPromise; + + promise(target?: any): JQueryPromise; } /* @@ -260,10 +288,7 @@ interface JQueryStatic { removeData(element: Element, name?: string): JQuery; // Deferred - Deferred: { - (beforeStart?: (deferred: JQueryDeferred) => any): JQueryDeferred; - new (beforeStart?: (deferred: JQueryDeferred) => any): JQueryDeferred; - }; + Deferred(beforeStart?: (deferred: JQueryDeferred) => any): JQueryDeferred; // Effects fx: { tick: () => void; interval: number; stop: () => void; speeds: { slow: number; fast: number; }; off: boolean; step: any; }; diff --git a/q/Q-tests.ts b/q/Q-tests.ts index 943f2bb4e2..504655c991 100644 --- a/q/Q-tests.ts +++ b/q/Q-tests.ts @@ -73,10 +73,11 @@ Q(arrayPromise) // type specification required .then(returnsNumPromise) // requires specification .then(num => num.toFixed()); -declare var jPromise: JQueryPromise; +declare var jPromise: JQueryPromise; // if jQuery promises definition supported generics, this could be more interesting example -Q(jPromise).then((val) => val.toExponential()); +Q(jPromise).then(str => str.split(',')); +jPromise.then(returnsNumPromise); declare var promiseArray: Q.IPromise[]; var qPromiseArray = promiseArray.map(p => Q(p));