Gestion exhaustive des erreurs avec des unions discriminées
Écrivez des gestionnaires exhaustifs pour les unions discriminées à l’aide de switch+never, de fonctions utilitaires et de vérifications de couverture à la compilation entre les modules.
Gestion exhaustive des erreurs avec des unions discriminées est une leçon TypeScript Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 2. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage TypeScript Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours TypeScript Academy comprend 2 leçons au total.
Introduction
Objectif : garantir que chaque membre d’une union est traité. Vous utiliserez switch + never, une petite fonction utilitaire exhaustiveCheck et découvrirez comment conserver la couverture entre les fichiers.
- Discriminants (champs tag)
- Instructions switch exhaustives
- Valeurs par défaut en cas d’échec immédiat
Union discriminée
Une union discriminée possède un tag commun (ici kind). Chaque variante contient ses propres données.
export type Payment =
| { kind: "Card"; last4: string }
| { kind: "Cash" }
| { kind: "Wire"; iban: string }Switch + never
La branche default affecte p à never. Si vous ajoutez une nouvelle variante ultérieurement, le compilateur signale une erreur jusqu’à ce que vous la traitiez.
export function describe(p: Payment): string {
switch (p.kind) {
case "Card": return `Card ••••${p.last4}`
case "Cash": return "Cash"
case "Wire": return `Wire ${p.iban}`
default: {
const _exhaustive: never = p
return _exhaustive
}
}
}Fonction utilitaire exhaustiveCheck
Utilisez une petite fonction utilitaire pour rendre l’intention évidente. Le paramètre never transforme les cas non traités en erreur de type, et non en une simple exception à l’exécution.
export function exhaustiveCheck(x: never): never {
throw new Error(`Unhandled case: ${JSON.stringify(x)}`)
}
export function pay(p: Payment): string {
switch (p.kind) {
case "Card": return "charged card"
case "Cash": return "took cash"
case "Wire": return "initiated wire"
default: return exhaustiveCheck(p)
}
}Couverture entre modules
Lorsque les unions sont définies dans un fichier et traitées dans un autre, l’ajout d’une branche interrompt toujours les compilations jusqu’à la mise à jour de toutes les instructions switch — exactement le comportement recherché.
// errors.ts
export type AppError =
| { tag: "Auth"; reason: "Unauthorized" | "Forbidden" }
| { tag: "NotFound"; resource: string }
| { tag: "Conflict"; resource: string }
// handler.ts
import type { AppError } from "./errors"
import { exhaustiveCheck } from "./exhaustive"
export function toStatus(e: AppError): number {
switch (e.tag) {
case "Auth": return e.reason === "Unauthorized" ? 401 : 403
case "NotFound": return 404
case "Conflict": return 409
default: return exhaustiveCheck(e)
}
}Conseils et pièges
Conseils :
- Préférez les tags littéraux de chaîne (par exemple
tag/kind). - Gardez les variantes petites ; composez les données avec des objets imbriqués plutôt qu’avec d’immenses unions.
- N’utilisez jamais
defaultsans gardenever; cela masque les cas manquants.
Vérification de l’exhaustivité
Vérification rapide : qu’est-ce qui impose de traiter tous les cas ?
Récapitulatif
Récapitulatif : utilisez un discriminant, écrivez une instruction switch et, dans la branche par défaut, affectez la valeur à never (ou appelez exhaustiveCheck) pour garantir une couverture complète à mesure que les unions évoluent.
Questions Fréquemment Posées
La leçon « Gestion exhaustive des erreurs avec des unions discriminées » est-elle gratuite ?
Oui — le texte complet de « Gestion exhaustive des erreurs avec des unions discriminées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours TypeScript Academy, passe à CoddyKit PRO. Le cours TypeScript Academy comprend 2 leçons au total.
Qu'est-ce que j'apprendrai dans « Gestion exhaustive des erreurs avec des unions discriminées » ?
Écrivez des gestionnaires exhaustifs pour les unions discriminées à l’aide de switch+never, de fonctions utilitaires et de vérifications de couverture à la compilation entre les modules. Tu pratiques TypeScript Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer TypeScript Academy ?
Aucune expérience préalable n'est requise. TypeScript Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 2.
Combien de temps prend la leçon « Gestion exhaustive des erreurs avec des unions discriminées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon TypeScript Academy ?
Oui. Chaque leçon TypeScript Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Types de style Result/Either
- Gestion exhaustive des erreurs avec des unions discriminées