Sobrecarga de la función TypeScript


La sección 6.3 de la especificación del lenguaje TypeScript habla sobre la sobrecarga de funciones y da ejemplos concretos sobre cómo implementarla. Sin embargo, si intento algo como esto:

export class LayerFactory { 

    constructor (public styleFactory: Symbology.StyleFactory) { }

    createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {           
         throw "not implemented";
    }                 

    createFeatureLayer(layerName : string, style : any) : any {
        throw "not implemented";
     }        

}

Recibo un error del compilador que indica un identificador duplicado a pesar de que los parámetros de la función son de diferentes tipos. Incluso si agrego un parámetro adicional a la segunda función createFeatureLayer, todavía obtengo un error de compilador. Ideas, por favor.

Author: Klaus Nji, 2012-11-03

5 answers

Esto puede deberse a que, cuando ambas funciones se compilan en JavaScript, su firma es totalmente idéntica. Como JavaScript no tiene tipos, terminamos creando dos funciones tomando el mismo número de argumentos. Por lo tanto, TypeScript nos restringe la creación de tales funciones.

TypeScript soporta sobrecarga basada en el número de parámetros, pero los pasos a seguir son un poco diferentes si comparamos con los idiomas OO. En respuesta a otra pregunta TAN, alguien lo explicó con un bonito ejemplo: Método de sobrecarga?.

Básicamente, lo que estamos haciendo es, estamos creando solo una función y un número de declaraciones para que TypeScript no da errores de compilación. Cuando este código se compila en JavaScript, la función concreta por sí sola será visible. Como una función JavaScript puede ser llamada pasando varios argumentos, simplemente funciona.

 145
Author: S. Ravi Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-12 08:05:28

Cuando se sobrecarga en TypeScript, solo se tiene una implementación con varias firmas.

class Foo {
    myMethod(a: string);
    myMethod(a: number);
    myMethod(a: number, b: string);
    myMethod(a: any, b?: string) {
        alert(a.toString());
    }
}

TypeScript solo reconoce las tres sobrecargas como posibles firmas para una llamada a un método, no la implementación real.

En su caso, personalmente usaría dos métodos con nombres diferentes, ya que no hay suficiente similitud en los parámetros, lo que hace que sea probable que el cuerpo del método necesite tener muchos "ifs" para decidir qué hacer.

TypeScript 1.4

A partir de TypeScript 1.4, normalmente puede eliminar la necesidad de una sobrecarga utilizando un tipo de unión. El ejemplo anterior se puede expresar mejor usando:

myMethod(a: string | number, b?: string) {
    alert(a.toString());
}

El tipo de a es "o bien string o number".

 156
Author: user75525,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-14 23:01:28

Puede declarar una función sobrecargada declarando que la función tiene un tipo que tiene múltiples firmas de invocación:

interface IFoo
{
    bar: {
        (s: string): number;
        (n: number): string;
    }
}

Luego lo siguiente:

var foo1: IFoo = ...;

var n: number = foo1.bar('baz');     // OK
var s: string = foo1.bar(123);       // OK
var a: number[] = foo1.bar([1,2,3]); // ERROR

La definición real de la función debe ser singular y realizar el envío apropiado internamente en sus argumentos.

Por ejemplo, usando una clase (que podría implementar IFoo, pero no tiene que hacerlo):

class Foo
{
    public bar(s: string): number;
    public bar(n: number): string;
    public bar(arg: any): any 
    {
        if (typeof(arg) === 'number')
            return arg.toString();
        if (typeof(arg) === 'string')
            return arg.length;
    }
}

Lo interesante aquí es que la forma any es oculto por las sobreescrituras más específicas.

var foo2: new Foo();

var n: number = foo2.bar('baz');     // OK
var s: string = foo2.bar(123);       // OK
var a: number[] = foo2.bar([1,2,3]); // ERROR
 37
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-18 12:17:05

Como un heads up a los demás, he oberserved que al menos como se manifiesta por TypeScript compilado por WebPack para Angular 2, se sobrescribe silenciosamente en lugar de métodos sobrecargados.

myComponent {
  method(): { console.info("no args"); },
  method(arg): { console.info("with arg"); }
}

Llamando:

myComponent.method()

Parece ejecutar el método con argumentos, ignorando silenciosamente la versión no-arg, con salida:

with arg
 2
Author: mtyson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-04 20:17:04
 I getting function overload error on visual studio code.
     **[ts] Duplicate function implementation.
     function greet(): string (+1 overload)**

function greet():string{
 return 'Hello';
}

let message=greet();
console.log(message);


 function greet(message:string):string{
 return message;
 }
let newMessage=greet('Hello how are you');
console.log(newMessage);

Result :  undefined  (result of no arg greet method)
          Hello how are you

 Please explain  why undefined.
 0
Author: Deepak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-22 06:46:31