Modélisez les états de votre application avec des unions que le compilateur vérifie à votre place.
Ouvrir cette leçon dans KodokonUn type littéral restreint une valeur à un contenu exact : 'info' plutôt que string. C'est la base d'API impossibles à mal utiliser : le compilateur refuse toute valeur hors liste, et votre éditeur propose l'autocomplétion.
type Level = "info" | "warn" | "error";
function log(level: Level, message: string): void {
console.log(`[${level}] ${message}`);
}
log("info", "Serveur demarre");
// log("fatal", "Boom"); -> refuse par le compilateurL'étape suivante consiste à combiner des types d'objets qui partagent une propriété littérale commune, appelée discriminant. Chaque état d'un appel réseau, par exemple, transporte uniquement les données qui le concernent : impossible d'accéder à data pendant le chargement.
type ApiState =
| { status: "loading" }
| { status: "success"; data: string[] }
| { status: "error"; message: string };
function render(state: ApiState): string {
switch (state.status) {
case "loading":
return "Chargement...";
case "success":
return state.data.join(", ");
case "error":
return state.message;
}
}Dans chaque case, TypeScript rétrécit le type : après case 'error', state.message existe et state.data n'existe pas. Ce mécanisme, le narrowing, remplace des vérifications manuelles fragiles. Ajoutez une garde d'exhaustivité pour verrouiller l'ensemble.
function assertNever(value: never): never {
throw new Error("Cas non gere : " + String(value));
}
function label(state: ApiState): string {
switch (state.status) {
case "loading": return "En cours";
case "success": return "Termine";
case "error": return "Echec";
default: return assertNever(state);
}
}