~/ 👨‍💻 uncodigo.com _


📘 TypeScript

Tipos vs Interfaces en TypeScript: cuándo usar cada uno

Felipe 3 min de lectura
Types e interfaces parecen lo mismo, pero no lo son. Aprende cuándo usar cada uno en TypeScript con ejemplos reales y decisiones prácticas.

Types e interfaces: parecen iguales, pero no lo son

Si estás empezando con TypeScript (o incluso si ya llevas tiempo), es muy probable que te hayas hecho esta pregunta:

¿Uso type o interface?

Ambos sirven para definir la forma de un objeto. Ambos funcionan. Ambos compilan.

Entonces… ¿da lo mismo?

La respuesta corta es: no. La respuesta útil es: depende del contexto.


El punto en común: describir estructuras

Tanto type como interface permiten definir la estructura de un objeto:

type UserType = {
  id: number;
  email: string;
};

interface UserInterface {
  id: number;
  email: string;
}

En este punto, son equivalentes. Si solo miras esto, parece una discusión innecesaria.

Pero TypeScript no se trata solo de escribir tipos, sino de cómo esos tipos evolucionan con tu código.


La primera gran diferencia: extensión

Extender interfaces

Las interfaces están pensadas para ser extendidas.

interface User {
  id: number;
  email: string;
}

interface AdminUser extends User {
  role: "admin";
}

Este patrón es muy común cuando modelas dominios o jerarquías claras.

Extender types

Los type se extienden usando intersecciones:

type User = {
  id: number;
  email: string;
};

type AdminUser = User & {
  role: "admin";
};

Funciona igual, pero semánticamente comunica algo distinto.


Interfaces pueden fusionarse (y eso importa)

Esta es una diferencia clave.

Las interfaces soportan declaration merging:

interface User {
  id: number;
}

interface User {
  email: string;
}

El resultado final es:

interface User {
  id: number;
  email: string;
}

Esto es muy útil cuando:

  • trabajas con librerías
  • extiendes tipos globales
  • haces augmentations (por ejemplo, en Express o Window)

Los type no permiten esto.


Types son más expresivos

Aquí es donde type brilla.

Los type pueden representar cosas que las interfaces no:

Union types

type Status = "idle" | "loading" | "success" | "error";

Tipos primitivos y compuestos

type ID = string | number;

Tuplas

type Point = [number, number];

Si necesitas algo que no sea estrictamente un objeto, type es la herramienta correcta.


Entonces… ¿cuándo usar cada uno?

Usa interface cuando:

  • defines la forma de objetos
  • modelas entidades del dominio
  • esperas que ese contrato se extienda
  • trabajas con clases
  • necesitas declaration merging

Usa type cuando:

  • necesitas unions
  • defines estados o variantes
  • trabajas con tipos primitivos
  • compones tipos con lógica más compleja

Un criterio práctico (regla simple)

Una regla que funciona muy bien en proyectos reales:

  • interfaces para objetos
  • types para todo lo demás

No es una ley, pero evita discusiones innecesarias y mantiene el código consistente.


Un error común: mezclar sin criterio

No hay nada peor que ver esto:

  • interfaces usadas para unions
  • types usados solo por costumbre
  • decisiones distintas en cada archivo

La consistencia es más importante que la elección perfecta.


Conclusión

type e interface no compiten: se complementan.

Elegir bien no hace que tu código compile mejor, pero sí hace que:

  • sea más legible
  • evolucione mejor
  • sea más fácil de mantener

Y en proyectos reales, eso es lo que realmente importa.

#typescript #types #interfaces #tipado #buenas practicas #arquitectura