From c3a688719edf7545818a18d3514c6ae5e4b257b6 Mon Sep 17 00:00:00 2001 From: Vadim Ogievetsky Date: Wed, 28 Jan 2015 11:15:55 -0800 Subject: [PATCH 1/2] fixed typing for async.parallel and co --- async/async-explicit-tests.ts | 44 +++++++++++++++++ async/async-explicit-tests.ts.tscparams | 1 + async/async.d.ts | 63 +++++++++++++------------ 3 files changed, 79 insertions(+), 29 deletions(-) create mode 100644 async/async-explicit-tests.ts create mode 100644 async/async-explicit-tests.ts.tscparams diff --git a/async/async-explicit-tests.ts b/async/async-explicit-tests.ts new file mode 100644 index 000000000..10d8f0bd2 --- /dev/null +++ b/async/async-explicit-tests.ts @@ -0,0 +1,44 @@ +/// + +interface StringCallback { (err: Error, result: string): void; } +interface AsyncStringGetter { (callback: StringCallback): void; } + +var taskArray: AsyncStringGetter[] = [ + function (callback) { + setTimeout(function () { + callback(null, 'one'); + }, 200); + }, + function (callback) { + setTimeout(function () { + callback(null, 'two'); + }, 100); + }, +]; + +async.series(taskArray, function (err, results) { console.log(results[0].match(/o/)) }); +async.parallel(taskArray, function (err, results) { console.log(results[0].match(/o/)) }); +async.parallelLimit(taskArray, 3, function (err, results) { console.log(results[0].match(/o/)) }); + + +interface Lookup { [key: string]: T; } +interface NumberCallback { (err: Error, result: number): void; } +interface AsyncNumberGetter { (callback: NumberCallback): void; } + +var taskDict: Lookup = { + one: function(callback){ + setTimeout(function(){ + callback(null, 1); + }, 200); + }, + two: function(callback){ + setTimeout(function(){ + callback(null, 2); + }, 100); + } +} + +async.series(taskDict, function(err, results) { console.log(results['one'].toFixed(1)) }); +async.parallel(taskDict, function(err, results) { console.log(results['one'].toFixed(1)) }); +async.parallelLimit(taskDict, 3, function(err, results) { console.log(results['one'].toFixed(1)) }); + diff --git a/async/async-explicit-tests.ts.tscparams b/async/async-explicit-tests.ts.tscparams new file mode 100644 index 000000000..3195c46cd --- /dev/null +++ b/async/async-explicit-tests.ts.tscparams @@ -0,0 +1 @@ +--noImplicitAny diff --git a/async/async.d.ts b/async/async.d.ts index 5f558c384..aae7eb1ae 100644 --- a/async/async.d.ts +++ b/async/async.d.ts @@ -3,10 +3,13 @@ // Definitions by: Boris Yankov // Definitions: https://github.com/borisyankov/DefinitelyTyped +interface Dict { [key: string]: T; } + interface ErrorCallback { (err?: Error): void; } -interface AsyncResultsCallback { (err: Error, results: T[]): void; } interface AsyncResultCallback { (err: Error, result: T): void; } -interface AsyncTimesCallback { (n: number, callback: AsyncResultsCallback): void; } +interface AsyncResultArrayCallback { (err: Error, results: T[]): void; } +interface AsyncResultDictCallback { (err: Error, results: Dict): void; } +interface AsyncTimesCallback { (n: number, callback: AsyncResultArrayCallback): void; } interface AsyncIterator { (item: T, callback: ErrorCallback): void; } interface AsyncResultIterator { (item: T, callback: AsyncResultCallback): void; } @@ -14,15 +17,17 @@ interface AsyncMemoIterator { (memo: R, item: T, callback: AsyncResultCall interface AsyncWorker { (task: T, callback: Function): void; } +interface AsyncTaskFn { (callback: AsyncResultCallback): void; } + interface AsyncQueue { length(): number; concurrency: number; started: boolean; paused: boolean; - push(task: T, callback?: AsyncResultsCallback): void; - push(task: T[], callback?: AsyncResultsCallback): void; - unshift(task: T, callback?: AsyncResultsCallback): void; - unshift(task: T[], callback?: AsyncResultsCallback): void; + push(task: T, callback?: AsyncResultArrayCallback): void; + push(task: T[], callback?: AsyncResultArrayCallback): void; + unshift(task: T, callback?: AsyncResultArrayCallback): void; + unshift(task: T[], callback?: AsyncResultArrayCallback): void; saturated: () => any; empty: () => any; drain: () => any; @@ -38,8 +43,8 @@ interface AsyncPriorityQueue { concurrency: number; started: boolean; paused: boolean; - push(task: T, priority: number, callback?: AsyncResultsCallback): void; - push(task: T[], priority: number, callback?: AsyncResultsCallback): void; + push(task: T, priority: number, callback?: AsyncResultArrayCallback): void; + push(task: T[], priority: number, callback?: AsyncResultArrayCallback): void; saturated: () => any; empty: () => any; drain: () => any; @@ -56,9 +61,9 @@ interface Async { each(arr: T[], iterator: AsyncIterator, callback: ErrorCallback): void; eachSeries(arr: T[], iterator: AsyncIterator, callback: ErrorCallback): void; eachLimit(arr: T[], limit: number, iterator: AsyncIterator, callback: ErrorCallback): void; - map(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; - mapSeries(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; - mapLimit(arr: T[], limit: number, iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; + map(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; + mapSeries(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; + mapLimit(arr: T[], limit: number, iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; filter(arr: T[], iterator: AsyncResultIterator, callback: (results: T[]) => any): any; select(arr: T[], iterator: AsyncResultIterator, callback: (results: T[]) => any): any; filterSeries(arr: T[], iterator: AsyncResultIterator, callback: (results: T[]) => any): any; @@ -70,33 +75,33 @@ interface Async { foldl(arr: T[], memo: R, iterator: AsyncMemoIterator, callback: AsyncResultCallback): any; reduceRight(arr: T[], memo: R, iterator: AsyncMemoIterator, callback: AsyncResultCallback): any; foldr(arr: T[], memo: R, iterator: AsyncMemoIterator, callback: AsyncResultCallback): any; - detect(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; - detectSeries(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; - sortBy(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; - some(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; - any(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; + detect(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; + detectSeries(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; + sortBy(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; + some(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; + any(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; every(arr: T[], iterator: AsyncResultIterator, callback: (result: boolean) => any): any; all(arr: T[], iterator: AsyncResultIterator, callback: (result: boolean) => any): any; - concat(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; - concatSeries(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultsCallback): any; + concat(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; + concatSeries(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; // Control Flow - series(tasks: T[], callback?: AsyncResultsCallback): void; - series(tasks: T, callback?: AsyncResultsCallback): void; - parallel(tasks: T[], callback?: AsyncResultsCallback): void; - parallel(tasks: T, callback?: AsyncResultsCallback): void; - parallelLimit(tasks: T[], limit: number, callback?: AsyncResultsCallback): void; - parallelLimit(tasks: T, limit: number, callback?: AsyncResultsCallback): void; + series(tasks: Array>, callback?: AsyncResultArrayCallback): void; + series(tasks: Dict>, callback?: AsyncResultDictCallback): void; + parallel(tasks: Array>, callback?: AsyncResultArrayCallback): void; + parallel(tasks: Dict>, callback?: AsyncResultDictCallback): void; + parallelLimit(tasks: Array>, limit: number, callback?: AsyncResultArrayCallback): void; + parallelLimit(tasks: Dict>, limit: number, callback?: AsyncResultDictCallback): void; whilst(test: Function, fn: Function, callback: Function): void; until(test: Function, fn: Function, callback: Function): void; - waterfall(tasks: T[], callback?: AsyncResultsCallback): void; - waterfall(tasks: T, callback?: AsyncResultsCallback): void; + waterfall(tasks: Function[], callback?: AsyncResultArrayCallback): void; + waterfall(tasks: Function, callback?: AsyncResultArrayCallback): void; queue(worker: AsyncWorker, concurrency: number): AsyncQueue; priorityQueue(worker: AsyncWorker, concurrency: number): AsyncPriorityQueue; - // auto(tasks: any[], callback?: AsyncResultsCallback): void; - auto(tasks: any, callback?: AsyncResultsCallback): void; + // auto(tasks: any[], callback?: AsyncResultArrayCallback): void; + auto(tasks: any, callback?: AsyncResultArrayCallback): void; iterator(tasks: Function[]): Function; - apply(fn: Function, ...arguments: any[]): void; + apply(fn: Function, ...arguments: any[]): AsyncTaskFn; nextTick(callback: Function): void; times (n: number, callback: AsyncTimesCallback): void; From 3552529f78b81f6eeaf215e8813a03037836288e Mon Sep 17 00:00:00 2001 From: Vadim Ogievetsky Date: Tue, 3 Feb 2015 21:16:00 -0800 Subject: [PATCH 2/2] updated PR following review from @lukehoban and @chbrown --- async/async-tests.ts | 74 ++++++++++++++++++++++++++++++++++++++------ async/async.d.ts | 43 ++++++++++++------------- 2 files changed, 86 insertions(+), 31 deletions(-) diff --git a/async/async-tests.ts b/async/async-tests.ts index 9a563276a..a6b041b4d 100644 --- a/async/async-tests.ts +++ b/async/async-tests.ts @@ -67,6 +67,17 @@ async.series([ ], function (err, results) { }); +async.series([ + function (callback) { + callback(null, 'one'); + }, + function (callback) { + callback(null, 'two'); + }, +], +function (err, results) { }); + + async.series({ one: function (callback) { setTimeout(function () { @@ -81,6 +92,21 @@ async.series({ }, function (err, results) { }); +async.series({ + one: function (callback) { + setTimeout(function () { + callback(null, 1); + }, 200); + }, + two: function (callback) { + setTimeout(function () { + callback(null, 2); + }, 100); + }, +}, +function (err, results) { }); + + async.parallel([ function (callback) { setTimeout(function () { @@ -95,6 +121,20 @@ async.parallel([ ], function (err, results) { }); +async.parallel([ + function (callback) { + setTimeout(function () { + callback(null, 'one'); + }, 200); + }, + function (callback) { + setTimeout(function () { + callback(null, 'two'); + }, 100); + }, +], +function (err, results) { }); + async.parallel({ one: function (callback) { @@ -110,6 +150,20 @@ async.parallel({ }, function (err, results) { }); +async.parallel({ + one: function (callback) { + setTimeout(function () { + callback(null, 1); + }, 200); + }, + two: function (callback) { + setTimeout(function () { + callback(null, 2); + }, 100); + }, +}, +function (err, results) { }); + var count = 0; @@ -136,7 +190,7 @@ async.waterfall([ ], function (err, result) { }); -var q = async.queue(function (task: any, callback) { +var q = async.queue(function (task: any, callback) { console.log('hello ' + task.name); callback(); }, 2); @@ -189,29 +243,29 @@ q.resume(); q.kill(); // tests for strongly typed tasks -var q2 = async.queue(function (task: string, callback) { +var q2 = async.queue(function (task: string, callback) { console.log('Task: ' + task); callback(); }, 1); q2.push('task1'); -q2.push('task2', function (error, results: string[]) { - console.log('Finished tasks: ' + results.join(', ')); +q2.push('task2', function (error) { + console.log('Finished tasks'); }); -q2.push(['task3', 'task4', 'task5'], function (error, results: string[]) { - console.log('Finished tasks: ' + results.join(', ')); +q2.push(['task3', 'task4', 'task5'], function (error) { + console.log('Finished tasks'); }); q2.unshift('task1'); -q2.unshift('task2', function (error, results: string[]) { - console.log('Finished tasks: ' + results.join(', ')); +q2.unshift('task2', function (error) { + console.log('Finished tasks'); }); -q2.unshift(['task3', 'task4', 'task5'], function (error, results: string[]) { - console.log('Finished tasks: ' + results.join(', ')); +q2.unshift(['task3', 'task4', 'task5'], function (error) { + console.log('Finished tasks'); }); var filename = ''; diff --git a/async/async.d.ts b/async/async.d.ts index aae7eb1ae..bb8890ef7 100644 --- a/async/async.d.ts +++ b/async/async.d.ts @@ -3,31 +3,32 @@ // Definitions by: Boris Yankov // Definitions: https://github.com/borisyankov/DefinitelyTyped -interface Dict { [key: string]: T; } +interface Dictionary { [key: string]: T; } interface ErrorCallback { (err?: Error): void; } interface AsyncResultCallback { (err: Error, result: T): void; } interface AsyncResultArrayCallback { (err: Error, results: T[]): void; } -interface AsyncResultDictCallback { (err: Error, results: Dict): void; } +interface AsyncResultObjectCallback { (err: Error, results: Dictionary): void; } interface AsyncTimesCallback { (n: number, callback: AsyncResultArrayCallback): void; } interface AsyncIterator { (item: T, callback: ErrorCallback): void; } interface AsyncResultIterator { (item: T, callback: AsyncResultCallback): void; } interface AsyncMemoIterator { (memo: R, item: T, callback: AsyncResultCallback): void; } -interface AsyncWorker { (task: T, callback: Function): void; } +interface AsyncWorker { (task: T, callback: ErrorCallback): void; } -interface AsyncTaskFn { (callback: AsyncResultCallback): void; } +interface AsyncFunction { (callback: AsyncResultCallback): void; } +interface AsyncVoidFunction { (callback: ErrorCallback): void; } interface AsyncQueue { length(): number; concurrency: number; started: boolean; paused: boolean; - push(task: T, callback?: AsyncResultArrayCallback): void; - push(task: T[], callback?: AsyncResultArrayCallback): void; - unshift(task: T, callback?: AsyncResultArrayCallback): void; - unshift(task: T[], callback?: AsyncResultArrayCallback): void; + push(task: T, callback?: ErrorCallback): void; + push(task: T[], callback?: ErrorCallback): void; + unshift(task: T, callback?: ErrorCallback): void; + unshift(task: T[], callback?: ErrorCallback): void; saturated: () => any; empty: () => any; drain: () => any; @@ -86,23 +87,23 @@ interface Async { concatSeries(arr: T[], iterator: AsyncResultIterator, callback: AsyncResultArrayCallback): any; // Control Flow - series(tasks: Array>, callback?: AsyncResultArrayCallback): void; - series(tasks: Dict>, callback?: AsyncResultDictCallback): void; - parallel(tasks: Array>, callback?: AsyncResultArrayCallback): void; - parallel(tasks: Dict>, callback?: AsyncResultDictCallback): void; - parallelLimit(tasks: Array>, limit: number, callback?: AsyncResultArrayCallback): void; - parallelLimit(tasks: Dict>, limit: number, callback?: AsyncResultDictCallback): void; - whilst(test: Function, fn: Function, callback: Function): void; - until(test: Function, fn: Function, callback: Function): void; - waterfall(tasks: Function[], callback?: AsyncResultArrayCallback): void; - waterfall(tasks: Function, callback?: AsyncResultArrayCallback): void; + series(tasks: Array>, callback?: AsyncResultArrayCallback): void; + series(tasks: Dictionary>, callback?: AsyncResultObjectCallback): void; + parallel(tasks: Array>, callback?: AsyncResultArrayCallback): void; + parallel(tasks: Dictionary>, callback?: AsyncResultObjectCallback): void; + parallelLimit(tasks: Array>, limit: number, callback?: AsyncResultArrayCallback): void; + parallelLimit(tasks: Dictionary>, limit: number, callback?: AsyncResultObjectCallback): void; + whilst(test: () => boolean, fn: AsyncVoidFunction, callback: (err: any) => void): void; + doWhilst(fn: AsyncVoidFunction, test: () => boolean, callback: (err: any) => void): void; + until(test: () => boolean, fn: AsyncVoidFunction, callback: (err: any) => void): void; + doUntil(fn: AsyncVoidFunction, test: () => boolean, callback: (err: any) => void): void; + waterfall(tasks: Function[], callback?: AsyncResultArrayCallback): void; queue(worker: AsyncWorker, concurrency: number): AsyncQueue; priorityQueue(worker: AsyncWorker, concurrency: number): AsyncPriorityQueue; - // auto(tasks: any[], callback?: AsyncResultArrayCallback): void; auto(tasks: any, callback?: AsyncResultArrayCallback): void; iterator(tasks: Function[]): Function; - apply(fn: Function, ...arguments: any[]): AsyncTaskFn; - nextTick(callback: Function): void; + apply(fn: Function, ...arguments: any[]): AsyncFunction; + nextTick(callback: Function): void; times (n: number, callback: AsyncTimesCallback): void; timesSeries (n: number, callback: AsyncTimesCallback): void;