sobrecarga - Extender otra función de TypeScript con argumentos adicionales
¿Es posible en TypeScript definir un tipo de función y extender su lista de argumentos en otro tipo (¿sobrecarga de tipo de función?)?
Digamos que tengo este tipo:
type BaseFunc = (a: string) => Promise<string>
Quiero definir otro tipo con un argumento adicional (b: number) y el mismo valor de retorno.
Si en algún momento en el futuro BaseFunc agrega o cambia argumentos, esto también debería reflejarse en mi tipo de función sobrecargada.
Respuesta #1
Puedes usar Tuplas en parámetros rest y expresiones spread junto con tipos condicionales y el comportamiento de inferencia de tipos condicionales para extraer los parámetros de la firma y reconstruir la nueva firma.
type BaseFunc = (a: string) => Promise<string>
type BaseWithB = BaseFunc extends (...a: infer U) => infer R ? (b: number, ...a:U) => R: never;
Respuesta #2
ACTUALIZACIÓN: es posible extender los parámetros de una función en TypeScript. Ve la respuesta de Titian.
Respuesta original: Dudo que se pueda hacer de la manera que describiste. Sin embargo, puedes intentar algo como esto:
interface BaseOptions {
a: string;
}
type BaseFunc = (options: BaseOptions) => Promise<string>
interface DerivedOptions implements BaseOptions {
b: number;
}
type DerivedFunc = (options: DerivedOptions) => Promise<string>
Otra ventaja de este enfoque es que tienes parámetros con nombre de forma gratuita. Así que va a ser más limpio desde el lado del llamador que simplemente llamar a BaseFunc o DerivedFunc con argumentos posicionales. Solo compara:
someFuncA(1, undefined, true);
// vs
someFuncB({nofiles: 1, enableLogging: true}); // and bar: undefined is just omitted
Respuesta #3
Podrías usar spread con Parameters<>:
function base(a: number, b: number, c: number): number
function derived(add: string, ...base: Parameters<typeof base>): number
La restricción es que los parámetros base tienen que estar al final.
