🧩 Interface

Une interface décrit la forme d'un objet : ses propriétés et leurs types. C'est le contrat que doit respecter tout objet de ce type.

interface User {
  id:      number;
  name:    string;
  email:   string;
  age?:    number;           // propriété optionnelle
  readonly createdAt: Date;  // lecture seule
}

const alice: User = {
  id: 1,
  name: "Alice",
  email: "alice@example.com",
  createdAt: new Date()
};

📝 Type Alias

Un type alias (mot-clé type) permet de nommer n'importe quel type, pas seulement les objets.

// Alias pour un type primitif
type ID = number | string;

// Alias pour un objet (similaire à interface)
type Point = {
  x: number;
  y: number;
};

// Alias pour une fonction
type Callback = (err: Error | null, data?: string) => void;

// Alias pour un tuple
type Coords = [number, number];
InterfaceType Alias
Extensible (declaration merging)Non extensible après déclaration
Héritage avec extendsIntersection avec &
Recommandé pour les objets/classesRecommandé pour unions, tuples, fonctions

🔀 Union Types & Intersection

// Union : l'une OU l'autre des valeurs
type Status = "pending" | "active" | "inactive";
type ID = number | string;

function format(id: ID): string {
  if (typeof id === "number") return `#${id.toString().padStart(6, "0")}`;
  return id;
}

// Intersection : TOUTES les propriétés combinées
type Named  = { name: string };
type Aged   = { age: number };
type Person = Named & Aged;  // { name: string; age: number }

🏷️ Literal Types & Discriminated Unions

// Types littéraux — valeurs exactes
type Direction = "north" | "south" | "east" | "west";
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE";

// Discriminated union — champ discriminant commun
type Shape =
  | { kind: "circle";    radius: number }
  | { kind: "rectangle"; width: number; height: number }
  | { kind: "triangle";  base: number;  height: number };

function area(shape: Shape): number {
  switch (shape.kind) {
    case "circle":    return Math.PI * shape.radius ** 2;
    case "rectangle": return shape.width * shape.height;
    case "triangle":  return (shape.base * shape.height) / 2;
  }
}
Discriminated unions sont l'un des patterns TypeScript les plus puissants — TS sait exactement quelles propriétés sont disponibles dans chaque branche.

🔗 Extension d'interfaces

// extends — héritage d'interface
interface Animal {
  name:  string;
  sound(): string;
}

interface Dog extends Animal {
  breed: string;
  fetch(): void;
}

// Plusieurs extensions
interface PoliceDog extends Dog {
  badgeNumber: string;
}

// Declaration merging — ajout de propriétés à une interface existante
interface Window {
  myCustomProp: string; // étend l'interface Window globale
}

📋 Index Signatures & Record

// Index signature — objet avec clés dynamiques
interface Dictionary {
  [key: string]: string;
}

const dict: Dictionary = {
  fr: "Bonjour",
  en: "Hello",
  es: "Hola"
};

// Record<K, V> — alternative plus concise
const scores: Record<string, number> = {
  alice: 95, bob: 87
};

// Record avec clés littérales
type Locale = "fr" | "en" | "es";
const greetings: Record<Locale, string> = {
  fr: "Bonjour", en: "Hello", es: "Hola"
};
📝 Exercices T02 🎯 QCM T02 ▶ Mini-projet T03 — Génériques →