Skip to content

Commit 89c11f3

Browse files
committed
Update type-level utils & generic compose
1 parent 5815908 commit 89c11f3

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

src/compose.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,27 @@ interface Fn extends Function {
88
}
99

1010
/**
11-
* A type-level utility function to
11+
* A type-level utility to get the type of the tail of a tuple of functions
1212
*/
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
1916

2017
/**
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
2220
*/
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]>
2432

2533
/**
2634
* Composes single-argument functions from right to left. The rightmost
@@ -113,9 +121,7 @@ export default function compose<
113121
fab: (...args: A) => B[0]
114122
): (...args: A) => F
115123
// 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>
119125
// generic base case type signature and function body implementation
120126
export default function compose<Fns extends Fn[]>(...fns: Fns): Fn {
121127
const len = fns.length

0 commit comments

Comments
 (0)