Укажите тип задачи для асинхронной очереди с использованием обобщений - PullRequest
0 голосов
/ 26 июня 2018

У меня есть это прямо сейчас:

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

Я не могу понять, является ли это правильным способом или каков правильный синтаксис.

1 Ответ

0 голосов
/ 09 июля 2018

Для определения типа для 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
...