La sección 6.3 de la especificación del lenguaje TypeScript habla sobre la sobrecarga de funciones y proporciona ejemplos concretos sobre cómo implementar esto. 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 función son de diferentes tipos. Incluso si agrego un parámetro adicional a la segunda función createFeatureLayer, sigo obteniendo un error del compilador. Ideas, por favor.
typescript
overloading
Klaus Nji
fuente
fuente
Respuestas:
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 con la misma cantidad de argumentos. Entonces, TypeScript nos restringe de crear tales funciones.
TypeScript admite la sobrecarga en función del número de parámetros, pero los pasos a seguir son un poco diferentes si los comparamos con los lenguajes OO. En respuesta a otra pregunta de SO, alguien lo explicó con un buen ejemplo: ¿Sobrecarga de método? .
Básicamente, lo que estamos haciendo es crear una sola función y varias declaraciones para que TypeScript no dé errores de compilación. Cuando este código se compila en JavaScript, solo se verá la función concreta. Como se puede invocar una función de JavaScript pasando varios argumentos, simplemente funciona.
fuente
type
s, enumeraciones, genéricos, etc., se pierden en el tiempo de ejecución. Por eso también no puedes hacerlosomeObject instanceof ISomeInterfaceDefinedInTypeScript
.Cuando sobrecarga en TypeScript, solo tiene una implementación con múltiples firmas.
TypeScript reconoce solo las tres sobrecargas como posibles firmas para una llamada a método, no la implementación real.
En su caso, personalmente usaría dos métodos con nombres diferentes, ya que no hay suficientes puntos en común en los parámetros, lo que hace que sea probable que el cuerpo del método tenga que tener muchos "si" 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:
El tipo de
a
es "cualquierastring
onumber
".fuente
class Foo { constructor(obj) { } constructor (a: number, b: string, c: boolean) {} }
Foo.fromObject(obj)
yFoo.fromJson(str)
etcétera.Foo.methos(1, 2, 3)
Foo.method(1)
Foo.method(Obj)
También noté que tienes diferentes métodos en laFoo
Clase, desde Objeto y desde Json?myNum
o demyObj
todos modos, entonces, ¿por qué no tener métodos separados y aclarar todo / evitar una lógica de ramificación innecesaria?Puede declarar una función sobrecargada declarando que la función tiene un tipo que tiene múltiples firmas de invocación:
Entonces lo siguiente:
La definición real de la función debe ser singular y realizar el despacho apropiado internamente en sus argumentos.
Por ejemplo, usando una clase (que podría implementarse
IFoo
, pero no tiene que hacerlo):Lo interesante aquí es que el
any
formulario está oculto por las anulaciones más específicamente escritas.fuente
¿Qué es la sobrecarga de funciones en general?
¿Qué es la sobrecarga de funciones en JS?
Esta característica no es posible en JS: la última función definida se toma en caso de declaraciones múltiples:
... y en TS?
Las sobrecargas son una construcción en tiempo de compilación sin impacto en el tiempo de ejecución de JS:
Se activa un error de implementación duplicado, si utiliza el código anterior (más seguro que JS). TS elige la primera sobrecarga de ajuste en orden de arriba hacia abajo, por lo que las sobrecargas se ordenan de la más específica a la más amplia.
Método de sobrecarga en TS: un ejemplo más complejo
Los tipos de métodos de clase sobrecargados se pueden usar de manera similar para sobrecargar la función:
Las sobrecargas muy diferentes son posibles, ya que la implementación de la función es compatible con todas las firmas de sobrecarga, aplicada por el compilador.
Más información:
fuente
Como aviso a los demás, he observado que, al menos según lo manifestado por TypeScript compilado por WebPack para Angular 2, silenciosamente se ESCRIBE en lugar de métodos sobrecargados.
Vocación:
parece ejecutar el método con argumentos, ignorando silenciosamente la versión sin argumentos, con salida:
fuente
Duplicate function implementation
advertencia para un código como este.Sobrecarga de funciones en mecanografiado:
Según Wikipedia, (y muchos libros de programación) la definición de sobrecarga de método / función es la siguiente:
En typecript no podemos tener implementaciones diferentes de la misma función que se llaman de acuerdo con el número y tipo de argumentos. Esto se debe a que cuando TS se compila a JS, las funciones en JS tienen las siguientes características:
Por lo tanto, en sentido estricto, se podría argumentar que la sobrecarga de la función TS no existe. Sin embargo, hay cosas que puede hacer dentro de su código TS que pueden imitar perfectamente la sobrecarga de funciones.
Aquí hay un ejemplo:
Los documentos de TS llaman a este método sobrecarga, y lo que básicamente hicimos fue proporcionar firmas de métodos múltiples (descripciones de posibles parámetros y tipos) al compilador de TS. Ahora TS puede descubrir si llamamos a nuestra función correctamente durante el tiempo de compilación y darnos un error si llamamos a la función incorrectamente.
fuente