Posted on 2021-02-04 21:13:05+00:00
You have a function with different return types based on whether or not rest parameters are passed in. Maybe it's a fringe edge case, but you never know when you'll need it. Read on to find a way to statically type this use case.
First, we have our use case without rest parameters:
1 | function overloaded(foo: number): number; |
Now we want our version with rest parameters to return something else:
1 | function overloaded(foo: number, ...objects: string[]): boolean; |
We can't have optional rest parameters in the first case, so the trick is to pass in an empty tuple, like so:
1 2 3 4 5 6 7 8 9 10 11 12 | function overloaded(foo: number, ...objects: []): number; function overloaded(foo: number, ...objects: string[]): boolean; function overloaded(foo: number, ...objects: [] | string[]): number | boolean { if (objects.length == 0) { return 1; } return true; } const value1 = overloaded(5) // Type will be number. const value2 = overloaded(5, "a", "b", "c") // Type will be boolean. |
And that's it. You're done, with static typing through and through.