/** ***************************************** * Created by edonet@163.com * Created on 2021-03-28 20:37:49 ***************************************** */ 'use strict'; /** ***************************************** * 加载依赖 ***************************************** */ import { U, F, FOP } from './d'; /** ***************************************** * 解析结果 ***************************************** */ type Thenable = ( T extends (...args: infer P) => void ? P extends [err: U, ...rest: infer Q] ? Promise : Promise : Promise ); /** ***************************************** * 重载列表 ***************************************** */ type Overloads = ( T extends [head: infer P, ...rest: infer Q] ? P extends [...rest: infer A, tail: infer R] ? ((...args: A) => Thenable) & Overloads : Record : Record ); /** ***************************************** * Promisify ***************************************** */ type Promisify = Overloads>; /** ***************************************** * Promisify ***************************************** */ export function promisify(handler: T): Promisify { function promised(this: unknown, ...args: unknown[]): Promise { return new Promise((resolve, reject) => { let resolved = false; // 添加回调 args.push((err: null | Error, ...rest: unknown[]) => { if (resolved) { return; } // 更新标识 resolved = true; // 执行失败 if (err) { return reject(err); } // 执行成功 resolve(rest.length > 1 ? rest : rest[0]); }); // 执行函数 handler.apply(this, args); }); } // 返回函数 return promised as unknown as Promisify; }