Skip to content

Instantly share code, notes, and snippets.

@AtsushiSuzuki
Created October 11, 2016 08:37
Show Gist options
  • Save AtsushiSuzuki/b31745cc2aa827588cf14ce52d0478bd to your computer and use it in GitHub Desktop.
Save AtsushiSuzuki/b31745cc2aa827588cf14ce52d0478bd to your computer and use it in GitHub Desktop.
TypeScript definition for promisify function
export function promisify(fn: (callback: (err: Error) => any) => any, thisArg?: any): () => Promise<void>;
export function promisify<R1>(fn: (callback: (err: Error, res1: R1) => any) => any, thisArg?: any): () => Promise<R1>;
export function promisify<R1, R2>(fn: (callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): () => Promise<[R1, R2]>;
export function promisify<R1, R2, R3>(fn: (callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): () => Promise<[R1, R2, R3]>;
export function promisify<R1, R2, R3, R4>(fn: (callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): () => Promise<[R1, R2, R3, R4]>;
export function promisify<T1>(fn: (arg1: T1, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1) => Promise<void>;
export function promisify<T1, R1>(fn: (arg1: T1, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1) => Promise<R1>;
export function promisify<T1, R1, R2>(fn: (arg1: T1, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1) => Promise<[R1, R2]>;
export function promisify<T1, R1, R2, R3>(fn: (arg1: T1, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1) => Promise<[R1, R2, R3]>;
export function promisify<T1, R1, R2, R3, R4>(fn: (arg1: T1, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1) => Promise<[R1, R2, R3, R4]>;
export function promisify<T1, T2>(fn: (arg1: T1, arg2: T2, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1, arg2: T2) => Promise<void>;
export function promisify<T1, T2, R1>(fn: (arg1: T1, arg2: T2, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1, arg2: T2) => Promise<R1>;
export function promisify<T1, T2, R1, R2>(fn: (arg1: T1, arg2: T2, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1, arg2: T2) => Promise<[R1, R2]>;
export function promisify<T1, T2, R1, R2, R3>(fn: (arg1: T1, arg2: T2, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1, arg2: T2) => Promise<[R1, R2, R3]>;
export function promisify<T1, T2, R1, R2, R3, R4>(fn: (arg1: T1, arg2: T2, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1, arg2: T2) => Promise<[R1, R2, R3, R4]>;
export function promisify<T1, T2, T3>(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3) => Promise<void>;
export function promisify<T1, T2, T3, R1>(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3) => Promise<R1>;
export function promisify<T1, T2, T3, R1, R2>(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3) => Promise<[R1, R2]>;
export function promisify<T1, T2, T3, R1, R2, R3>(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3) => Promise<[R1, R2, R3]>;
export function promisify<T1, T2, T3, R1, R2, R3, R4>(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3) => Promise<[R1, R2, R3, R4]>;
export function promisify<T1, T2, T3, T4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<void>;
export function promisify<T1, T2, T3, T4, R1>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<R1>;
export function promisify<T1, T2, T3, T4, R1, R2>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<[R1, R2]>;
export function promisify<T1, T2, T3, T4, R1, R2, R3>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<[R1, R2, R3]>;
export function promisify<T1, T2, T3, T4, R1, R2, R3, R4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<[R1, R2, R3, R4]>;
export function promisify<T1, T2, T3, T4, T5>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<void>;
export function promisify<T1, T2, T3, T4, T5, R1>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<R1>;
export function promisify<T1, T2, T3, T4, T5, R1, R2>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<[R1, R2]>;
export function promisify<T1, T2, T3, T4, T5, R1, R2, R3>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<[R1, R2, R3]>;
export function promisify<T1, T2, T3, T4, T5, R1, R2, R3, R4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<[R1, R2, R3, R4]>;
export function promisify<T1, T2, T3, T4, T5, T6>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<void>;
export function promisify<T1, T2, T3, T4, T5, T6, R1>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<R1>;
export function promisify<T1, T2, T3, T4, T5, T6, R1, R2>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<[R1, R2]>;
export function promisify<T1, T2, T3, T4, T5, T6, R1, R2, R3>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<[R1, R2, R3]>;
export function promisify<T1, T2, T3, T4, T5, T6, R1, R2, R3, R4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<[R1, R2, R3, R4]>;
export function promisify<T1, T2, T3, T4, T5, T6, T7>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Promise<void>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, R1>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Promise<R1>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, R1, R2>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Promise<[R1, R2]>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, R1, R2, R3>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Promise<[R1, R2, R3]>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, R1, R2, R3, R4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Promise<[R1, R2, R3, R4]>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, T8>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: Error) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Promise<void>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, T8, R1>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: Error, res1: R1) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Promise<R1>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, T8, R1, R2>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: Error, res1: R1, res2: R2) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Promise<[R1, R2]>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, T8, R1, R2, R3>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: Error, res1: R1, res2: R2, res3: R3) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Promise<[R1, R2, R3]>;
export function promisify<T1, T2, T3, T4, T5, T6, T7, T8, R1, R2, R3, R4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: Error, res1: R1, res2: R2, res3: R3, res4: R4) => any) => any, thisArg?: any): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Promise<[R1, R2, R3, R4]>;
const args = 8;
const results = 4;
for (let i = 0; i <= args; i++) {
for (let j = 0; j <= results; j++) {
const typeArguments = (0 < i + j)
? "<" + range(i).map((x) => `T${x}`).concat(range(j).map((y) => `R${y}`)).join(", ") + ">"
: "";
const callbackType = `(err: Error${range(j).map((y) => `, res${y}: R${y}`).join("")}) => any`;
const functionType = `(${range(i).map((x) => `arg${x}: T${x}, `).join("")}callback: ${callbackType}) => any`;
const promiseType = (j === 0)
? `Promise<void>`
: (j === 1)
? `Promise<R1>`
: `Promise<[${range(j).map((y) => `R${y}`).join(", ")}]>`;
const resultType = `(${range(i).map((x) => `arg${x}: T${x}`).join(", ")}) => ${promiseType}`;
console.log(`export function promisify${typeArguments}(fn: ${functionType}, thisArg?: any): ${resultType};`);
}
}
function range(n: number): number[] {
const results: number[] = [];
for (let i = 1; i <= n; i++) {
results.push(i);
}
return results;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment