typescript - Proporcionar tipo Task para cola asíncrona usando genéricos
Tengo esto ahora mismo:
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);
¿No hay una manera de dar información de tipo a async.queue sobre la tarea usando genéricos?
algo así:
export const q = async.queue<Task>((task: Task, cb) => task(cb), 2);
No puedo averiguar si esta es la manera correcta de hacerlo o cuál es la sintaxis correcta.
Respuesta #1
Las definiciones de tipo para async requieren de 2 a 3 argumentos de tipo. En la versión con 2 argumentos, el primer argumento es el tipo de tarea, y el segundo argumento es el callback. Mi suposición es que estas definiciones de tipo fueron escritas antes de que los tipos condicionales estuvieran disponibles para extraer el tipo de callback de la tarea (o que los mantenedores no desean usar tipos condicionales para mantener la compatibilidad con versiones anteriores a la 2.8).
Puedes pasar el segundo parámetro:
export const q2 = async.queue<Task, EVCb>((task, cb) => task(cb), 2);
Editar
También podemos agregar un nuevo método async como una ampliación del módulo, que solo requiere un parámetro, ya que desde TypeScript 2.8 ahora es posible extraer parámetros de tipo de otros tipos (esto podría ser una buena contribución a las definiciones si alguien está dispuesto a hacerlo):
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
