Búsqueda de sitios web

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.

Artículos relacionados