Kodokon kodokon.com

type vs interface : extends et intersection

Choisissez la bonne construction pour modéliser et composer vos types d'objets sans dupliquer de code.

8 min · 3 questions

Ouvrir cette leçon dans Kodokon

Vous savez déjà déclarer des types d'objets. La vraie question en projet, c'est de choisir entre type et interface, puis de composer des types existants sans dupliquer de code. Commençons par le terrain le plus courant : modéliser des entités qui se ressemblent.

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

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

const admin: Admin = {
  id: 1,
  name: "Ada",
  permissions: ["users:write"],
};
Étendre une interface avec extends

extends crée une relation claire : un Admin est un User enrichi. Avec un alias type, on obtient le même résultat grâce à l'intersection &, qui fusionne plusieurs formes en une seule. C'est l'outil idéal pour les préoccupations transversales, comme des horodatages présents sur toutes vos entités.

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

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

type StoredProduct = Product & Timestamps;
Composer des types avec l'intersection &

Alors, lequel choisir ? Deux différences comptent vraiment. Premièrement, seul type peut nommer une union comme 'active' | 'archived'. Deuxièmement, deux déclarations d'interface portant le même nom fusionnent automatiquement : pratique pour enrichir les types d'une bibliothèque, dangereux si c'est involontaire.

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

interface Config {
  locale: string;
}

interface Config {
  debug: boolean;
}

const config: Config = { locale: "fr", debug: true };
Union réservée à type, fusion de déclarations d'interface

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Vous devez nommer le type 'draft' | 'published'. Quelle construction est obligatoire ?
    • interface
    • type
    • Les deux fonctionnent
    • enum
  2. Deux déclarations interface Config { ... } coexistent dans la même portée. Que se passe-t-il ?
    • Erreur de compilation immédiate
    • La seconde écrase la première
    • Elles fusionnent en une seule interface
    • La première est prioritaire
  3. Quel opérateur combine deux alias de type objet en un seul type exigeant les propriétés des deux ?
    • |
    • &
    • extends