La sobrecarga de métodos?

votos
75

¿Hay una manera de hacer la sobrecarga de métodos en el lenguaje mecanografiado?

Quiero lograr algo como esto:

class TestClass {
    someMethod(stringParameter: string): void {
        alert(Variant #1: stringParameter =  + stringParameter);
    }

    someMethod(numberParameter: number, stringParameter: string): void {
        alert(Variant #2: numberParameter =  + numberParameter + , stringParameter =  + stringParameter);
    }
}

var testClass = new TestClass();
testClass.someMethod(string for v#1);
testClass.someMethod(12345, string for v#2);

Aquí está un ejemplo de lo que no quiero hacer (yo odio esa parte de la sobrecarga de corte en JS):

class TestClass {
    private someMethod_Overload_string(stringParameter: string): void {
        // A lot of code could be here... I don't want to mix it with switch or if statement in general function
        alert(Variant #1: stringParameter =  + stringParameter);
    }

    private someMethod_Overload_number_string(numberParameter: number, stringParameter: string): void {
        alert(Variant #2: numberParameter =  + numberParameter + , stringParameter =  + stringParameter);
    }

    private someMethod_Overload_string_number(stringParameter: string, numberParameter: number): void {
        alert(Variant #3: stringParameter =  + stringParameter + , numberParameter =  + numberParameter);
    }

    public someMethod(stringParameter: string): void;
    public someMethod(numberParameter: number, stringParameter: string): void;
    public someMethod(stringParameter: string, numberParameter: number): void;

    public someMethod(): void {
        switch (arguments.length) {
        case 1:
            if(typeof arguments[0] == string) {
                this.someMethod_Overload_string(arguments[0]);
                return;
            }
            return; // Unreachable area for this case, unnecessary return statement
        case 2:
            if ((typeof arguments[0] == number) &&
                (typeof arguments[1] == string)) {
                this.someMethod_Overload_number_string(arguments[0], arguments[1]);
            }
            else if ((typeof arguments[0] == string) &&
                     (typeof arguments[1] == number)) {
                this.someMethod_Overload_string_number(arguments[0], arguments[1]);
            }
            return; // Unreachable area for this case, unnecessary return statement
        }
    }
}


var testClass = new TestClass();
testClass.someMethod(string for v#1);
testClass.someMethod(12345, string for v#2);
testClass.someMethod(string for v#3, 54321);
Publicado el 02/10/2012 a las 11:03
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
107

De acuerdo con la especificación, mecanografiado hace método de soporte sobrecarga, pero es bastante incómodo e incluye una gran cantidad de trabajo manual de comprobación de tipos de parámetros. Creo que es sobre todo porque lo más cerca que se puede llegar a la sobrecarga de métodos en la llanura JavaScript incluye la comprobación de que también y mecanografiado trata de no modificar cuerpos de los métodos actuales para evitar cualquier costo de rendimiento en tiempo de ejecución innecesaria.

Si he entendido bien, usted tiene que escribir primero una declaración de método para cada una de las sobrecargas y luego una implementación del método que comprueba sus argumentos para decidir cuál de sobrecarga se llamaba. La firma de la aplicación tiene que ser compatible con todas las sobrecargas.

class TestClass {
    someMethod(stringParameter: string): void;
    someMethod(numberParameter: number, stringParameter: string): void;

    someMethod(stringOrNumberParameter: any, stringParameter?: string): void {
        if (stringOrNumberParameter && typeof stringOrNumberParameter == "number")
            alert("Variant #2: numberParameter = " + stringOrNumberParameter + ", stringParameter = " + stringParameter);
        else
            alert("Variant #1: stringParameter = " + stringOrNumberParameter);
    }
}
Respondida el 02/10/2012 a las 12:00
fuente por usuario

votos
18

Actualizar para mayor claridad. La sobrecarga de métodos a máquina de escribir es una característica útil en la medida en que le permite crear definiciones de tipos de bibliotecas existentes con una API que necesita ser representado.

Al escribir su propio código, sin embargo, bien puede ser capaz de evitar la sobrecarga cognitiva de sobrecargas utilizando parámetros opcionales o por defecto. Esta es la alternativa más legible a sobrecargas de método y también mantiene su API honesto como usted evitará la creación de sobrecargas mediante los pedidos poco intuitivo.

La ley general de mecanografiado sobrecarga es:

Si usted puede eliminar las firmas de sobrecarga y todas las pruebas pasan, no es necesario sobrecargas mecanografiado

Generalmente, usted puede lograr lo mismo con los parámetros opcionales, o por defecto - o con tipos de unión, o con un poco de orientación a objetos.

La pregunta real

La pregunta real pide una sobrecarga de:

someMethod(stringParameter: string): void {

someMethod(numberParameter: number, stringParameter: string): void {

Ahora incluso en lenguajes que soportan sobrecargas con implementaciones separadas (nota: sobrecargas mecanografiado comparten una sola aplicación) - programadores son consejos para proporcionar consistencia en el pedido. Esto haría que las firmas:

someMethod(stringParameter: string): void {

someMethod(stringParameter: string, numberParameter: number): void {

El stringParametersiempre se requiere, por lo que va en primer lugar. Se puede escribir esto como una sobrecarga de trabajo mecanografiado:

someMethod(stringParameter: string): void;
someMethod(stringParameter: string, numberParameter: number): void;
someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}

Sin embargo, siguiendo la ley de sobrecargas mecanografiado, podemos eliminar las firmas de sobrecarga y todas nuestras pruebas todavía pasaremos.

someMethod(stringParameter: string, numberParameter?: number): void {
    if (numberParameter != null) {
        // The number parameter is present...
    }
}

La pregunta real, en el orden real

Si se determinaron a persistir con el orden original, las sobrecargas serían:

someMethod(stringParameter: string): void;
someMethod(numberParameter: number, stringParameter: string): void;
someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}

Ahora que es una gran cantidad de ramificación de averiguar dónde poner los parámetros, pero que realmente querían preservar este orden si usted está leyendo esto ahora ... Pero espera, ¿qué ocurre si aplicamos la ley de sobrecargas mecanografiado?

someMethod(a: string | number, b?: string | number): void {
  let stringParameter: string;
  let numberParameter: number;

  if (typeof a === 'string') {
    stringParameter = a;
  } else {
    numberParameter = a;

    if (typeof b === 'string') {
      stringParameter = b;
    }
  }
}

Ya lo suficientemente ramificación

Por supuesto, dada la cantidad de comprobación de tipos que tenemos que hacer ... tal vez la mejor respuesta es simplemente tener dos métodos:

someMethod(stringParameter: string): void {
  this.someOtherMethod(0, stringParameter);
}

someOtherMethod(numberParameter: number, stringParameter: string): void {
  //...
}
Respondida el 02/10/2012 a las 11:16
fuente por usuario

votos
7

Deseo. Quiero que esta característica también, pero mecanografiado necesidades para que funcione con JavaScript sin tipo que no tiene métodos sobrecargados. es decir, si su método sobrecargado se llama desde JavaScript entonces sólo puede obtener enviado a una implementación del método.

Hay \ sa pocas discusiones pertinentes en CodePlex. p.ej

https://typescript.codeplex.com/workitem/617

Todavía pienso mecanografiado debe generar toda la if'ing y la conmutación por lo que no tendría que hacerlo.

Respondida el 20/07/2013 a las 15:11
fuente por usuario

votos
2

Javascript no tiene ningún concepto de sobrecarga. Letra de imprenta no es C # o Java.

Pero se puede poner en práctica la sobrecarga a máquina de escribir.

Leer este post http://www.gyanparkash.in/function-overloading-in-typescript/

Respondida el 08/12/2018 a las 06:15
fuente por usuario

votos
1

¿Por qué no usar interfaz definida propiedad opcional como el argumento de la función ..

Para el caso en esta pregunta, utilizando una interfaz de línea definido con algunas propiedades opcionales sólo directamente podría hacer que el código como algo a continuación:

class TestClass {

    someMethod(arg: { stringParameter: string, numberParameter?: number }): void {
        let numberParameterMsg = "Variant #1:";
        if (arg.numberParameter) {
            numberParameterMsg = `Variant #2: numberParameter = ${arg.numberParameter},`;
        }
        alert(`${numberParameterMsg} stringParameter = ${arg.stringParameter}`);
    }
}

var testClass = new TestClass();
testClass.someMethod({ stringParameter: "string for v#1" });
testClass.someMethod({ numberParameter: 12345, stringParameter: "string for v#2" });

Debido a la sobrecarga proporcionada a máquina de escribir es, como se menciona en los comentarios de los demás, sólo una lista de diferentes firmas de función sin tener que apoyar los códigos de ejecución correspondientes al igual que otros lenguajes estáticos. Por lo que la aplicación todavía tiene que ser hecho en un solo cuerpo de la función, lo que hace que el uso de la sobrecarga de funciones a máquina de escribir no tan cómodo como tales idiomas que apoyan la función de sobrecarga real.

Sin embargo, todavía hay muchas materias nuevas y convenientes proporcionados a máquina que no está disponible en el lenguaje de programación legado, donde el apoyo de propiedad opcional en una interfaz anónimo es un enfoque para satisfacer la zona cómoda de la sobrecarga de funciones legado, creo.

Respondida el 10/12/2017 a las 12:12
fuente por usuario

votos
0
class User{
   name : string;
   age : number;
   constructor(name:string,age:number){
    this.name = name;
    this.age = age;
    console.log("User " +this.name+ " Created")
}
getName(name:string = ""):string{
    if(name != ""){
        return name + " " +this.name;
    }else{
        return this.name;
    }
  }

}

Creo que esto debería funcionar

Respondida el 28/06/2017 a las 02:50
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more