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() };
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];
| Interface | Type Alias |
|---|---|
| Extensible (declaration merging) | Non extensible après déclaration |
Héritage avec extends | Intersection avec & |
| Recommandé pour les objets/classes | Recommandé pour unions, tuples, fonctions |
// 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 }
// 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; } }
// 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 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" };