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

Provide Task type for async queue using generics

我现在有这个:

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);

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

像这样:

export const q = async.queue<Task>((task: Task, cb) => task(cb), 2);

我不知道这是正确的方法还是正确的语法。

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

可以传入第二个参数:

export const q2 = async.queue<Task, EVCb>((task, cb) => task(cb), 2);

编辑

我们还可以添加一个新的 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