Для определения типа для async
требуется 2-3 аргумента типа.В версии с 2 аргументами первый аргумент является типом задачи, а второй аргумент является обратным вызовом.Я предполагаю, что эти определения типов были написаны до того, как условный тип стал доступен для извлечения типа обратного вызова из задачи (или что сопровождающие не хотят использовать условные типы для обеспечения совместимости с версиями ниже 2.8
).
Вы можете передать второй параметр:
export const q2 = async.queue<Task, EVCb>((task, cb) => task(cb), 2);
Редактировать
Мы также можем добавить новый метод async
в качестве расширения модуля, что требует только одного параметра, так как начиная с машинописного текста 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