Interfaces: introducción

Las interfaces son una de las particularidades más importantes de TypeScript (y también una de las más antiguas), mediante las cuales se pueden declarar tipos de una manera similar y a veces más flexible que mediante los tipos alias, con los que podemos definir la forma de los objetos que luego usaremos en nuestros programas.

Las interfaces en TypeScript funcionan como contratos que definen qué propiedades y tipos deben tener los objetos para ser considerados de un tipo específico. Cuando creamos una interfaz, estamos estableciendo una especificación con un nombre que describe qué campos y tipos debe contener un objeto para cumplir con ese contrato. Por ejemplo, podríamos definir una interfaz llamada UserData que exija que un objeto tenga las propiedades username de tipo string, createdAt de tipo Date y superuser de tipo boolean.

Aunque en capítulos anteriores hemos trabajado con type alias para crear tipos con nombre que representan estructuras, las interfaces tienen un enfoque particular. Históricamente, las interfaces ofrecían funcionalidades que los type alias no tenían, pero con el tiempo, TypeScript ha ido incorporando muchas de esas características a los type alias, reduciendo las diferencias entre ambos. Sin embargo, las interfaces siguen siendo muy utilizadas, especialmente cuando trabajamos con módulos de terceros que fueron escritos hace tiempo y que emplean interfaces. Además, las interfaces permiten crear tipos más versátiles y avanzados en ciertos contextos, algo que no siempre es posible con type alias.

Para ilustrar cómo se define una interfaz, podemos imaginar una función login que devuelve un objeto con información de usuario. Este objeto podría tener la siguiente forma:

interface UserData {
  username: string;
  createdAt: Date;
  superuser: boolean;
}

function login(): UserData {
  return {
    username: "admin",
    createdAt: new Date(),
    superuser: true,
  };
}

const data = login();

Aquí, la función login está tipada para devolver un objeto que cumple con la interfaz UserData. Esto significa que cualquier variable que reciba ese objeto, como data, será reconocida por TypeScript como un objeto que tiene exactamente las propiedades y tipos definidos en UserData.

Un aspecto importante de las interfaces es que cuando declaramos que un objeto es de un tipo interfaz, debemos implementar exactamente lo que la interfaz requiere. No podemos añadir propiedades adicionales que no estén definidas en la interfaz. Por ejemplo, si intentamos agregar un campo country al objeto data que no está declarado en UserData, TypeScript nos mostrará un error porque esa propiedad no forma parte del contrato definido por la interfaz.

Esto puede parecer restrictivo, pero tiene sentido porque cuando usamos una interfaz para tipar un objeto, TypeScript solo reconoce las propiedades declaradas en esa interfaz. Así, si intentamos acceder a data.country, no será posible, ya que country no está definido en UserData. Además, aunque internamente el objeto pueda tener más propiedades, TypeScript solo permitirá trabajar con las que están especificadas en la interfaz.

En el contexto de la programación orientada a objetos, usamos el término implementar para referirnos a que un objeto o clase cumple con la especificación de una interfaz. Más adelante, cuando trabajemos con clases, veremos que implements es una palabra clave que nos permite asegurar que una clase cumple con una interfaz determinada, garantizando que tiene todas las propiedades y métodos que la interfaz define.

Por ahora, al trabajar con objetos simples, debemos recordar que las interfaces exigen que implementemos exactamente lo que se declara, ni más ni menos. Esto nos ayuda a mantener estructuras claras y seguras en nuestro código, evitando errores y facilitando la comprensión de qué datos se están manejando en cada momento.

En próximos capítulos profundizaremos en aspectos más avanzados de las interfaces y cómo aprovecharlas al máximo en TypeScript, especialmente en combinación con clases y otros patrones de programación.

Lista de reproducción
  1. 1
    Temporada 1
    5 minutos
  2. 2
    ¿Qué es TypeScript?
    11 minutos
  3. 3
    Instalando TypeScript
    8 minutos
  4. 4
    Compilando un Hola Mundo sencillo
    7 minutos
  5. 5
    Hola Mundo pero con tipos
    10 minutos
  6. 6
    Tipos: tipos primitivos
    12 minutos
  7. 7
    Tipos: tipos especiales (any, null, ...)
    10 minutos
  8. 8
    Tipos: arrays y tuplas
    11 minutos
  9. 9
    Tipos: objetos
    7 minutos
  10. 10
    Funciones: lo básico
    9 minutos
  11. 11
    Funciones: tipando funciones
    9 minutos
  12. 12
    Clases: introducción a las clases
    9 minutos
  13. 13
    Clases: creando una clase
    10 minutos
  14. 14
    Clases: modificador private
    8 minutos
  15. 15
    Clases: modificador readonly
    3 minutos
  16. 16
    Clases: Atributos virtuales con getters y setters
    10 minutos
  17. 17
    Clases: herencia
    9 minutos
  18. 18
    Clases: modificadores abstract y protected
    8 minutos
  19. 19
    Tipos alias
    6 minutos
  20. 20
    Tipos literales
    5 minutos
  21. 21
    Uniones de tipos
    7 minutos
  22. 22
    Uniones discriminantes
    7 minutos
  23. 23
    Intersecciones de tipos
    5 minutos
  24. 24
    Interfaces: introducción
    7 minutos
  25. 25
    Interfaces: modificadores y funciones
    9 minutos
  26. 26
    Interfaces: usándolas con clases
    8 minutos
  27. 27
    Interfaces: herencia de interfaces
    8 minutos
  28. 28
    Interfaces: interfaces indizadas
    5 minutos
  29. 29
    Interfaces: funciones y tipos híbridos
    5 minutos
  30. 30
    ¿Qué diferencia hay entre interfaces y tipos? (2020)
    8 minutos
  31. 31
    Casteos con as
    6 minutos
  32. 32
    instanceof y las guardas
    9 minutos
  33. 33
    Tipos enumerados
    8 minutos
  34. 34
    Valores avanzados para enumerados
    7 minutos
  35. 35
    Enumerados con valores computados
    6 minutos
  36. 36
    Genéricos en tipos
    8 minutos
  37. 37
    Múltiples genéricos y buenas prácticas
    5 minutos
  38. 38
    Genéricos en funciones
    8 minutos
  39. 39
    Genéricos con restricciones
    6 minutos
  40. 40
    Tipos de utilidad
    3 minutos
  41. 41
    Exportando módulos
    9 minutos
  42. 42
    Importando módulos
    7 minutos
  43. 43
    Export default e import asterisco
    6 minutos
  44. 44
    tsconfig
    7 minutos
  45. 45
    Módulos desde NPM
    7 minutos
  46. 46
    Arroba types y los .d.ts
    8 minutos
  47. 47
    Ejemplo (1): creando una API REST simple en TypeScript
    11 minutos
  48. 48
    Ejemplo (2): montando un servidor Express
    8 minutos
  49. 49
    Ejemplo (3): haciendo las funciones de control de datos
    11 minutos
  50. 50
    Ejemplo (4): conectando todas las piezas
    7 minutos