Typing a promisify Function
function promisify<Args extends unknown[], Res>(
fn: (...args: [...Args, (result: Res) => void]) => void
): (...args: Args) => Promise<Res> {
return function (...args: Args) { <1>
return new Promise((resolve) => { <2>
function callback(res: Res) { <3>
resolve(res);
}
fn.call(null, ...[...args, callback]); <4>
});
};
}