I am trying to wrap an overloaded function (from a package I did not write, so I cannot edit the overload declarations) and retain the original parameters and return types of the function. Typescript seems to only pick up the last declared overload function when deciding how to type the wrapper.
Does anyone know of a way to generically wrap an overloaded function and retain typings of all overloads? It would be nice if we could have a Partial<Tuple>
function wrap<T extends (...args: any[]) => any>(
fn: T,
wrapper: (fn: T, ...args: Parameters<T>) => ReturnType<T>
) {
return (...args: Parameters<T>) => wrapper(fn, ...args)
}
declare function echo(text: string): void
declare function echo(text: string, options: {}): void
const echoWrapped = wrap(echo, (fn, text) => {
return fn(text)
})
echoWrapped('hello') // error TS2554: Expected 2 arguments, but got 1.