Herencia en #TypeScript

TypeScript

En la entrada anterior hablamos de que las clases no existen en Javascript. Pero además, tampoco existe el concepto de herencia verdadera, aunque sí hay herencia. Ahora, vamos a ver cuál es la propuesta de TypeScript en este aspecto:

Herencia en TypeScript

Javascript es un lenguaje preparado para prototipos, y la herencia está basada en ello. Por contra, TypeScript soporta el modelo de herencia que está más alineado con otros lenguajes orientados a objetos, por lo que es más fácil trabajar si proceder de otros lenguajes, así como está en la línea planteada para ECMAScript 6.

ECMAScript 6 soporta la palabra clave extends, lo que facilita que una clase puede ser extendida por las propiedades de otra clase, de forma que la segunda clase tendrá, además de todo lo incluido en la primera (sus métodos, propiedades y funciones), sus propios métodos, funciones y propiedades. (Un detalle muy importante es que aprender TypeScript es una forma de prepararse para el futuro de Javascript, puesto que la tendencia es que Javascript se aproxime a lo establecido en ECMAScript 6, por lo que los desarrolladores de TypeScript pueden continuar con sus desarrollos manteniendo consistencia en su código, mientras que será el compilador de TypeScript el que se encargará de ponerlo a funcionar como código Javascript. Sólo se puede heredar de una clase, tal cual sucede en otros lenguajes como C# o Java.

Para llamar a la clase base, hay que usar explícitamente la palabra clave super (de esta manera sucede en Java). El étodo super hace una llamada al contructor de la clase base, lo que permite beneficiarse de ésta, en lugar de tener que reescribir la funcionalidad de la clase base. Las subclases tambuién pueder sobreescribir métodos en la clase base para incrementar así su funcionalidad.

Una clase derivada hereda todos los miembros de su clase base , pero no los sobreescribe. La herencia significa que una clase derivada recibe todos los métoso no sobreescritos de la clase base. Sólo los metodos públicos y las propiedades protegidas pueden ser sobreescritos.

Una propiedad en una clase derivada puede convertirse en una propiedad sobreescrita de la clase base si la propiedad de la clase derivada se llama igual (y tienen el mismo tipo) que la propiedad de la clase base. Es importante destacar que el tipo debe coincidir entre la propiedad sobre escrita y la base, porque en caso contrario, saltarían problemas de compilación.

Algunas cosas a tener en cuenta respecto al trabajo con herencia, y que conviene recordar:

  • Las funciones de una instancia a la clase base pueden ser anulados por funciones de la instancia de la clase derivadas, pero no por otros tipos de miembros.
  • Variables miembro de una instancia de la clase Base y descriptores de acceso pueden ser anulados por variables de miembro de instancia de clase derivadas y descriptores de acceso, pero no por otros tipos de miembros.
  • Las propiedades estáticas de la clase base pueden ser anulados por propiedades estáticas de la clase derivada de cualquier tipo, siempre y cuando los tipos son compatibles.

Pero .. se puede dar un paso más!

Sobrecargas y sobreescrituras

Typescript soporta sobrecargas, esto es, funciones con el mismo nombre pero con diferente número de parámetros y sobreescrituras, o sea, crear una función en una subclase del mismo nombre que la función de la clase base pero con otra funcionalidad. Las sobrecargas se pueden usar tanto en las clases As with other object-oriented languages, TypeScript supports function overloads (functions with the same name but different parameter signatures) and overrides (creating a function in a subclass with the same name as the function in the base class but with different functionality). Overloads can be used in a base class or a subclass. Overrides can only be used in a subclass.

Creo que lo visto hasta ahora es demasiado teórico, pero hay que saber de su existencia en TypeScript. Ahora falta ponerlo en práctica, y esto ya depende de tí y de las necesiades del problema a resolver.

Happy coding!