Implementación de la función de duplicado mecanografiado

4 minutos de lectura

He definido las siguientes dos firmas de funciones en la misma clase de TypeScript, es decir,

public emit<T1>(event: string, arg1: T1): void {}

y

public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void {}

Sin embargo, al transpilar el texto mecanografiado, aparece el siguiente error

error TS2393: Duplicate function implementation.

Pensé que podría sobrecargar las funciones en mecanografiado siempre que la cantidad de parámetros en la firma de la función fuera diferente. Dado que las firmas anteriores tienen 2 y 3 parámetros respectivamente, ¿por qué recibo este error de transpilación?

  • No hay sobrecarga de funciones en mecanografiado, ni siquiera sin genéricos.

    – Tamas Hegedus

    25/09/2016 a las 17:44

  • Lea la documentación sobre la sobrecarga con más atención. La sobrecarga no significa que pueda proporcionar múltiples implementaciones; significa que puede proporcionar múltiples firmas, con una sola implementación. Pero en este caso, ¿por qué no estás simplemente escribiendo arg2??

    usuario663031

    25/09/2016 a las 17:46


  • @torazaburo. Estoy tratando de garantizar la seguridad de los tipos a través de los genéricos. si uso arg2? Todavía tendré que proporcionar el tipo genérico T2 en emit<T1,T2> aunque es posible que en realidad no esté usando T2. Supongo que estoy tratando de lograr algo similar a c # Func y Action firmas de los delegados. Pero podría haber una mejor manera.

    – James B.

    25/09/2016 a las 17:54


  • Si se refiere a proporcionar el tipo genérico T2 en el definición de la función, esto no daña nada. si se refieren a vocación la función, proporcionando cualquier tipo, como en emit<number, string> no debería ser necesario ya que los tipos se recogerán de los tipos de los argumentos. De todos modos, si es necesario, escriba las dos declaraciones sin cuerpo (solo un punto y coma), luego escriba una implementación que de alguna manera comprueba la presencia de arg2o quizás le asigne un valor predeterminado.

    usuario663031

    25/09/2016 a las 18:03


  • ¿Responde esto a tu pregunta? Sobrecarga de la función TypeScript

    – Vega

    22 de julio a las 10:49

Supongo que tu código se ve así:

public emit<T1>(event: string, arg1: T1): void {}
public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void {}
public emit(event: string, ...args: any[]): void {
    // actual implementation here
}

El problema es que tienes {} después de las primeras 2 líneas. En realidad, esto define un implementación vacía de una función, es decir, algo como:

function empty() {}

Sólo desea definir un escribe para la función, no un implementación. Así que reemplace los bloques vacíos con solo un punto y coma:

public emit<T1>(event: string, arg1: T1): void;
public emit<T1,T2>(event: string, arg1: T1, arg2: T2): void;
public emit(event: string, ...args: any[]): void {
    // actual implementation here
}

  • Cuando sobrecarga TypeScript, solo tiene una implementación con varias firmas. Ver stackoverflow.com/questions/13212625/…

    – Mateo K.

    25 de junio de 2018 a las 16:08

  • Entonces, ¿si esas tres funciones contienen lógicas diferentes?

    – Prashant Pimpale

    1 de febrero de 2019 a las 7:57

  • Hay tres firmas, pero solo una implementación. Si necesita una lógica diferente según la firma que se utilizó, deberá agregar algunas comprobaciones adicionales dentro de su implementación. Por ejemplo, podría comprobar args.length para saber si solo arg1 fue aprobado, o si ambos arg1 y arg2 fueron pasados.

    – Mattias Buelens

    5 de febrero de 2019 a las 16:00

  • Todas estas son funciones nulas. Pero qué hacer con los valores de retorno genéricos. Por ejemplo, ¿qué pasa si el tipo de retorno de la primera sobrecarga es T1 (o string) mientras que el segundo tipo de retorno de sobrecarga si T2?

    – Ark-kun

    28 de junio a las 2:03

export {}

Simplemente agregue esta línea en la parte superior del archivo mecanografiado

  • Funciona. La pregunta es: ¿Por qué? 🙂

    – Andreas Susewind

    29 de enero a las 17:06

  • “Otra causa del error es tener una falla debido a los archivos de secuencias de comandos heredados. Si solo tiene una única definición para la función en el archivo, agregue la línea de exportación {} a su archivo para convertirlo en un Módulo ES” De este blog

    – aditya tyagi

    19 de junio a las 15:42


¿Ha sido útil esta solución?