Kodokon kodokon.com

type vs interface: extends e intersección

Elige la construcción adecuada para modelar y componer tus tipos de objeto sin duplicar código.

8 min · 3 preguntas

Abrir esta lección en Kodokon

Ya sabes declarar tipos de objeto. La verdadera cuestión en un proyecto es elegir entre type e interface, y luego componer tipos existentes sin duplicar código. Empecemos con el escenario más habitual: modelar entidades que se parecen entre sí.

TYPESCRIPT
interface User {
  id: number;
  name: string;
}

interface Admin extends User {
  permissions: string[];
}

const admin: Admin = {
  id: 1,
  name: "Ada",
  permissions: ["users:write"],
};
Extender una interface con extends

extends crea una relación clara: un Admin es un User con poderes adicionales. Con un alias type, obtienes el mismo resultado mediante el operador de intersección &, que fusiona varias formas en una sola. Es la herramienta perfecta para preocupaciones transversales, como las marcas de tiempo presentes en todas tus entidades.

TYPESCRIPT
type Timestamps = {
  createdAt: Date;
  updatedAt: Date;
};

type Product = {
  id: number;
  label: string;
};

type StoredProduct = Product & Timestamps;
Componer tipos con la intersección &

Entonces, ¿cuál elegir? Dos diferencias importan de verdad. Primera, solo type puede nombrar una unión como 'active' | 'archived'. Segunda, dos declaraciones de interface que comparten el mismo nombre se fusionan automáticamente: práctico para ampliar los tipos de una biblioteca, peligroso cuando ocurre por accidente.

TYPESCRIPT
type Status = "active" | "archived";

interface Config {
  locale: string;
}

interface Config {
  debug: boolean;
}

const config: Config = { locale: "fr", debug: true };
Las uniones son exclusivas de type, las declaraciones de interface se fusionan

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. Necesitas nombrar el tipo 'draft' | 'published'. ¿Qué construcción se requiere?
    • interface
    • type
    • Ambas funcionan
    • enum
  2. Dos declaraciones interface Config { ... } coexisten en el mismo ámbito. ¿Qué ocurre?
    • Un error de compilación inmediato
    • La segunda sobrescribe la primera
    • Se fusionan en una sola interface
    • La primera tiene prioridad
  3. ¿Qué operador combina dos alias de tipo de objeto en un único tipo que exige las propiedades de ambos?
    • |
    • &
    • extends