From 85eabfe63b58f4b03e9afee11f4f778e5c9330cc Mon Sep 17 00:00:00 2001 From: Andrew Gaspar Date: Wed, 3 Jul 2013 01:36:17 -0700 Subject: [PATCH 1/2] Added typings to jQuery promises and deferreds. --- jquery/jquery-tests.ts | 3 +- jquery/jquery.d.ts | 67 +++++++++++++++++++++++++++++------------- q/Q-tests.ts | 2 +- 3 files changed, 48 insertions(+), 24 deletions(-) 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..5254e98b12 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; +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(doneCallbacks: any, failCallbacks?: any, progressCallbacks?: any): JQueryDeferred; + + 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..d647fabde8 100644 --- a/q/Q-tests.ts +++ b/q/Q-tests.ts @@ -73,7 +73,7 @@ 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()); From 284f4a629ae74f643ce4e72d705a89b8ee5141c7 Mon Sep 17 00:00:00 2001 From: Andrew Gaspar Date: Fri, 5 Jul 2013 01:06:47 -0700 Subject: [PATCH 2/2] Minor fixes for issue #726 --- jquery/jquery.d.ts | 2 +- q/Q-tests.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/jquery/jquery.d.ts b/jquery/jquery.d.ts index 5254e98b12..c2f9f47ddb 100644 --- a/jquery/jquery.d.ts +++ b/jquery/jquery.d.ts @@ -98,7 +98,7 @@ interface JQueryPromise { progress(...progressCallbacks: any[]): JQueryPromise; // Deprecated - given no typings - pipe(doneFilter?: (x: any) => any, failFilter?: (x: any) => any, progressFilter?: (x: any) => any): JQueryPromise; + 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; diff --git a/q/Q-tests.ts b/q/Q-tests.ts index d647fabde8..504655c991 100644 --- a/q/Q-tests.ts +++ b/q/Q-tests.ts @@ -76,7 +76,8 @@ Q(arrayPromise) // type specification required 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));