ProgramaciónDesarrollador Fullstack

¿Cómo funciona la extensión de tipos (extends), qué matices hay en su uso con tipos e interfaces, y cómo afecta esto a la estructura de tu proyecto?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

En TypeScript, se pueden extender (heredar) tipos tanto mediante interface extends como mediante type & type (tipos de intersección). Además, las interfaces pueden extender tipos y viceversa.

Interfaces utilizan la palabra clave extends para heredar propiedades:

interface Animal { name: string; } interface Bird extends Animal { wings: number; }

Tipos pueden ser combinados a través de &:

type Animal = { name: string }; type Bird = Animal & { wings: number };

Además, una interfaz puede extender otro tipo:

type Base = { id: number }; interface Derived extends Base { description: string; }

Particularidades:

  • Las interfaces soportan la fusión declarativa (declaration merging), los tipos no.
  • Se recomiendan interfaces si se espera ampliar otras entidades (por ejemplo, para bibliotecas).
  • Los extends anidados pueden provocar una jerarquía complicada, dificultar el mantenimiento y crear conflictos de nombres.

Pregunta trampa

¿Se puede extender un tipo (type) a través de una interfaz o viceversa? ¿Qué error comete la mayoría?

Muchos creen que solo se pueden extender interfaces a través de interfaces, pero en realidad una interfaz puede extender un tipo:

type Basic = { flag: boolean }; interface Extra extends Basic { name: string; }

Sin embargo, un tipo no puede extender otros tipos a través de extends — solo a través de la intersección de tipos (&).

Ejemplos de errores reales debido al desconocimiento de los matices del tema


Historia

En un gran proyecto, se combinaban interfaces a través de extends, olvidando que las propiedades con el mismo nombre debían coincidir en tipo. Cuando alguien cambió el tipo de una propiedad en la interfaz padre, surgieron conflictos silenciosos en las interfaces hijas, y la base dejó de coincidir con la API.

Historia

En una biblioteca se escribieron alias de tipo con superposición de propiedades a través de & (intersecciones), pero algunas propiedades se hicieron incompatibles en tipo. TypeScript permitió esto en el momento de la compilación, pero en tiempo de ejecución surgieron campos indefinidos en los sistemas.

Historia

El equipo pensaba que no se podía extender una interfaz con un tipo, y para ampliar la funcionalidad común reescribían todas las estructuras de type a interface, gastando mucho tiempo y esfuerzo — aunque solo se podría extender tipos existentes de manera no estándar.