Problema de inferencia de tipo TypeScript

Estoy usando TypeScript con el controlador MongoDB node.js. Tenga en cuenta que esta no es una pregunta de Mongo, es solo el caso de uso particular de este problema que estoy teniendo.

Casi todas las llamadas de Mongo usan un patrón de(arg1, arg2, ..., argn, callback) dóndecallback es una función que acepta(err, res). Sin embargo, quiero usar promesas. Estoy tratando de simplificar mi uso escribiendo una función de contenedor auxiliar, de esta manera:

function mongoWrap<T>(action: (callback: (err: Error, res: T) => void) => void) : q.IPromise<T>
{
    var promise = q.Promise<T>((resolve, reject) => {
       action((err, res) => {
           if (err) reject(err);
           else resolve(res);
       });
    });

    return promise;
}

Esto funciona muy bien, excepto que por alguna razón el compilador no puede inferir el tipo deT. Tengo que hacer llamadas como:

var dbPromise = mongoWrap<mongodb.Db>(cb => mongoClient.connect("mongodb://localhost:27017/database", cb));

Si omito el<mongodb.Db> parte, el resultado esPromise<{}> y pierdo el tipo de seguridad. Sin embargo, el compilador sabe claramente que elcallback argumento a la llamada de Mongo es(err: Error, db: Db) => void.

¿Qué puedo hacer para que el compilador deduzca correctamente el tipo deT?

Respuestas a la pregunta(2)

Su respuesta a la pregunta