Cuando empiezas en TypeScript, te encuentras con un dilema existencial: ¿debo usar interface
o type
? Tranquilo, no estás solo. Es una de esas preguntas que tienen a más de un desarrollador perdiendo el sueño y discutiendo en foros como si fuera el fin del mundo. Pero no te preocupes, intentaré explicarlo con ejemplos claros y un poco de sarcasmo.
Interfaces: un contrato que no puedes romper
Las interfaces sirven para definir la estructura de un objeto. Es como un contrato: si dices que algo tiene un nombre name
y una edad age
, más vale cumplirlo o TypeScript te mirará con desaprobación.
interface Person {
name: string;
age: number;
}
const user: Person = { name: "John", age: 25 }; // ✅ Correcto
const anotherUser: Person = { name: "Ana" }; // ❌ Error: falta la propiedad age
Tipos: un disfraz para tus datos
Los tipos son un poco más flexibles. Puedes usarlos para definir estructuras similares a las interfaces, pero también para unir tipos, hacer alias y otras cosas divertidas.
type Person = {
name: string;
age: number;
};
type ID = string | number;
const user: Person = { name: "Peter", age: 30 }; // ✅ Correcto
const identifier: ID = 123; // También podrías usar un string
Diferencias clave
Características | Interface | Type |
---|---|---|
Extensibilidad | ✅ Sí, se pueden extender | ⚠️ No directamente, pero se pueden combinar |
Uso con clases | ✅ Sí, pueden implementarse en clases | ❌ No |
Tipos uniones | ❌ No se pueden unir directamente | ✅ Sí, permite combinaciones |
Redefinición | ✅ Sí, puedes agregar más propiedades después | ❌ No, una vez definido queda fijo |
Casos útiles
Cuando construimos una API por ejemplo, necesitamos definir las estructuras de los datos que enviamos y recibimos. Pudiésemos hacer uso de ambas estructuras:
// Estructura de un usuario (interfaz)
interface User {
id: number;
name: string;
email: string;
}
// Estructura de la respuesta HTTP con (tipo)
type ApiResponse<T> = {
status: number;
data: T;
message?: string;
};
async function getUser(id: number): Promise<ApiResponse<User>> {
return {
status: 200,
data: { id, name: "Alice", email: "[email protected]" },
};
}
Aquí User
es un contrato fijo, mientras que ApiResponse<T>
es una plantilla flexible para cualquier tipo de respuesta que queramos manejar.
Estrategia para decidir qué usar
Si aún no tienes claro si usar una interfaz o u tipo, aquí hay algunas preguntas que te pueden ayudar:
- ¿Estoy definiendo la estructura de un objeto? → Usa
interface
. - ¿Necesito combinar varios tipos en uno solo? → Usa
type
. - ¿Voy a extender esta estructura en el futuro? → Usa
interface
. - ¿Necesito definir un alias para un tipo más complejo? → Usa
type
. - ¿Voy a usar clases que implementan esta estructura? → Usa
interface
.
Si sigues sin estar seguro, usa interface
por defecto. Es más fácil de extender y mantener en proyectos grandes.
Conclusión
TypeScript nos da herramientas poderosas, pero como todo en la vida, hay que saber cuándo usar cada una. Si usas type
cuando deberías usar interface
, probablemente no pase nada catastrófico, pero si alguien ve tu código, podrías recibir miradas de desaprobación.
Así que ahora ya lo sabes: interfaces para contratos, tipos para flexibilidad.
Sin correo no deseado, sin compartir con terceros. Solo tú y yo.
Discusión de miembros