使用泛型为异步队列提供任务类型

Ale*_*lls 6 async.js typescript tsc

我现在有这个:

export type EVCb = (err:any, val?:any) => void;
export type Task = (cb: EVCb) => void;
export const q = async.queue((task: Task, cb) => task(cb), 2);
Run Code Online (Sandbox Code Playgroud)

有没有办法使用泛型提供有关任务的async.queue类型信息?

这样的事情:

export const q = async.queue<Task>((task: Task, cb) => task(cb), 2);
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这是否是正确的方法或正确的语法.

Tit*_*mir 4

的类型定义需要async2-3 个类型参数。在有 2 个参数的版本中,第一个参数是任务类型,第二个参数是回调。我的猜测是,这些类型定义是在条件类型可用于从任务中提取回调类型之前编写的(或者维护者不希望使用条件类型来维护与低于该版本的兼容性2.8)。

可以传入第二个参数:

export const q2 = async.queue<Task, EVCb>((task, cb) => task(cb), 2);
Run Code Online (Sandbox Code Playgroud)

编辑

我们还可以添加一种新async方法作为模块增强,它只需要一个参数,因为从 typescript 2.8 开始,现在可以从其他类型中提取类型参数(如果有人愿意的话,这可能是对定义的一个很好的贡献) ):

declare module 'async' {
    type GetCallbackParameter<T extends (cb: any)=> void> = T extends (cb: infer C)=> void ? C: never;

    export function queue<T extends (cb: any)=> void>(worker: async.AsyncWorker<T,GetCallbackParameter<T>> , concurrency?: number): AsyncQueue<T>;
}

export const q2 = async.queue<Task>((task, cb) => task(cb), 2); // cb inferred correctly
Run Code Online (Sandbox Code Playgroud)