@@ -8,19 +8,27 @@ interface Fn extends Function {
8
8
}
9
9
10
10
/**
11
- * A type-level utility function to
11
+ * A type-level utility to get the type of the tail of a tuple of functions
12
12
*/
13
- type Tail < Fns extends Fn [ ] > = Fns extends < A > (
14
- a : A ,
15
- ...rest : infer Rest
16
- ) => unknown
17
- ? Rest
18
- : never
13
+ type Tail < Fns extends Fn [ ] > = (
14
+ ...fns : Fns
15
+ ) => unknown extends < A > ( a : A , ...rest : infer Rest ) => unknown ? Rest : never
19
16
20
17
/**
21
- * A type-level utility function to
18
+ * A type-level utility to get the type of the last function from a tuple of
19
+ * functions
22
20
*/
23
- type Last < Fns extends Fn [ ] > = Fns [ Tail < Fns > [ 'length' ] ]
21
+ type Last < Fns extends Fn [ ] > = Fns [ 'length' ] extends 0
22
+ ? never
23
+ : Fns [ Tail < Fns > [ 'length' ] ]
24
+
25
+ /**
26
+ * A type-level utility to get the return type of the composition of a tuple of
27
+ * functions
28
+ */
29
+ type Composed < Fns extends Fn [ ] > = (
30
+ ...args : Parameters < Last < Fns > >
31
+ ) => ReturnType < Fns [ 0 ] >
24
32
25
33
/**
26
34
* Composes single-argument functions from right to left. The rightmost
@@ -113,9 +121,7 @@ export default function compose<
113
121
fab : ( ...args : A ) => B [ 0 ]
114
122
) : ( ...args : A ) => F
115
123
// generic type signature for any number of functions
116
- export default function compose < Fns extends Fn [ ] > (
117
- ...funcs : Fns
118
- ) : ( ...args : Parameters < Last < Fns > > ) => ReturnType < Fns [ 0 ] >
124
+ export default function compose < Fns extends Fn [ ] > ( ...funcs : Fns ) : Composed < Fns >
119
125
// generic base case type signature and function body implementation
120
126
export default function compose < Fns extends Fn [ ] > ( ...fns : Fns ) : Fn {
121
127
const len = fns . length
0 commit comments