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;