Interface vs Type
Interface
- Ideal para definir contratos para la estructura de objetos, especialmente en programación orientada a objetos}
- Está mas limitado a estructura de objectos
- Permite fusionar declaraciones
- Se puede extender fácilmente con
extends - Para trabajar con clases (
implements)
Type
typesoporta uniones, intersecciones y tipos más complejos- Usar
typesi se necesita uniones, tuplas o funciones más compactas - Para extenderlo,
typeusa intersección con& typeno permite redefiniciones
Ejemplos
Definición de un objecto
- Ambos se usan igual para objetos
// Con interface
interface Persona {
nombre: string;
edad: number;
}
const persona1: Persona = {
nombre: "Juan",
edad: 30,
};
// Con type
type Persona = {
nombre: string;
edad: number;
};
const persona2: PersonaType = {
nombre: "Ana",
edad: 25,
};
Usando interface en clases
- Solo las interfaces pueden ser implementadas en clases con
implements
// Interface
interface Usuario {
nombre: string;
iniciarSesion(): void;
}
// Class
class Cliente implements Usuario {
nombre: string;
constructor(nombre: string) {
this.nombre = nombre;
}
iniciarSesion() {
console.log(`${this.nombre} inició sesión`);
}
}
// New
const usuario1 = new Cliente("Carlos");
usuario1.iniciarSesion(); // Carlos inició sesión
Extensión
- Ambos pueden extender, pero
interfaceusaextendsytypeusa&
// Con interface
interface Persona {
nombre: string;
}
interface Empleado extends Persona {
salario: number;
}
const empleado1: Empleado = {
nombre: "Lucas",
salario: 2000,
};
// Con type (usando intersección)
type PersonaType = {
nombre: string;
};
type EmpleadoType = PersonaType & { salario: number };
const empleado2: EmpleadoType = {
nombre: "Elena",
salario: 3000,
};
Fusión de tipos
- Las
interfacespermiten declarar varias veces el mismo nombre y se combinan automáticamente:
interface Usuario {
nombre: string;
}
interface Usuario {
edad: number;
}
// Se fusiona automáticamente en:
// { nombre: string; edad: number }
- Con
typeesto no es posible
type Usuario = { nombre: string };
type Usuario = { edad: number }; // ❌ Error: Duplicate identifier
Funciones
- Ambos pueden definir funciones pero
typelo hace de forma más compacta - Se usan igual, pero
typees más compacto
// Con interface
interface Suma {
(a: number, b: number): number;
}
const sumar: Suma = (x, y) => x + y;
console.log(sumar(5, 3)); // 8
// Con type
type Multiplicar = (a: number, b: number) => number;
const multiplicar: Multiplicar = (x, y) => x * y;
console.log(multiplicar(5, 3)); // 15
Uniones y Tuplas (solo con type)
- Solo
typepermite uniones (|) - Las tuplas solo se pueden definir con
type
// Uniones
type Status = "active" | "inactive";
const userStats: Status = "active"
type Id = string | number;
const userId1: Id = 123;
const userId2: Id = "abc123";
// Tuplas
type Coordenadas = [number, number];
const punto: Coordenadas = [10, 20];