export function promisify(f: (cb: (err: any, res: T) => void) => void, thisContext?: any): () => Promise export function promisify(f: (arg: A, cb: (err: any, res: T) => void) => void, thisContext?: any): (arg: A) => Promise export function promisify( f: (arg: A, arg2: A2, cb: (err: any, res: T) => void) => void, thisContext?: any ): (arg: A, arg2: A2) => Promise export function promisify( f: (arg: A, arg2: A2, arg3: A3, cb: (err: any, res: T) => void) => void, thisContext?: any ): (arg: A, arg2: A2, arg3: A3) => Promise export function promisify( f: (arg: A, arg2: A2, arg3: A3, arg4: A4, cb: (err: any, res: T) => void) => void, thisContext?: any ): (arg: A, arg2: A2, arg3: A3, arg4: A4) => Promise export function promisify( f: (arg: A, arg2: A2, arg3: A3, arg4: A4, arg5: A5, cb: (err: any, res: T) => void) => void, thisContext?: any ): (arg: A, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Promise export function promisify(f: any, thisContext?: any) { return function (...a: any[]) { const args = Array.prototype.slice.call(a) return new Promise(async (resolve, reject) => { try { args.push((err: any, result: any) => (err ? reject(err) : resolve(result))) await f.apply(thisContext, args) } catch (e) { reject(e) } }) } }