/** ***************************************** * Created by edonet@163.com * Created on 2021-03-23 23:10:37 ***************************************** */ 'use strict'; /** ***************************************** * 元子函数 ***************************************** */ type P = (state: unknown) => unknown; /** ***************************************** * 函数参数 ***************************************** */ type A = T extends (argv: infer P) => unknown ? P : never; /** ***************************************** * 函数返回值 ***************************************** */ type R = T extends (argv: unknown) => infer P ? P : void; /** ***************************************** * 函数列表 ***************************************** */ type Fn = ( T extends [] ? [] : T extends [P] ? T : T extends [infer U, infer V] ? [(argv: R) => R, V] : T extends [argv1: infer U, argv2: infer V, ...rest: infer W] ? [(argv: R) => R, ...Fn<[V, ...W]>, ] : P[] ); /** ***************************************** * 组合函数 ***************************************** */ type Componse = ( T extends [] ? () => void : T extends [infer U] ? U : T extends [head: infer V, ...rest: unknown[], tail: infer U] ? (argv: A) => R : () => void ); /** ***************************************** * 组合函数 ***************************************** */ export function compose(...args: Fn): Componse { // 校验参数 args.forEach(handler => { if (typeof handler !== 'function') { throw new Error('expect handler to be a function!'); } }); // 定义函数 function fn(state: unknown): unknown { return args.reduceRight((result, handler) => handler(result), state); } // 返回函数 return fn as Componse; }