Aller au contenu principal
U/
Types
typescript

Result<T, E> en union discriminée

Définir un type Result générique avec union discriminée, implémenter une fonction division qui retourne Result<number, string>, et utiliser le narrowing typé pour traiter les deux cas.

30 minPublié le 20 mai 2026Proposé par Anonyme

Défi

// Lisez attentivement, codez sur votre machine

Énoncé

Définir type Result<T, E> = { ok: true; valeur: T } | { ok: false; erreur: E }. Écrire la fonction division(a: number, b: number): Result<number, string> qui retourne { ok: true, valeur: a / b } si b !== 0, et { ok: false, erreur: "division par zéro" } sinon. Appeler la fonction avec deux paires de valeurs et afficher soit le résultat soit l'erreur en utilisant le narrowing sur le champ ok.

Contraintes

  • TypeScript ≥ 5.0, mode strict activé.
  • Le discriminant doit être le champ ok: true / ok: false (pas un champ type ou kind).
  • Utiliser un if (res.ok) pour le narrowing — pas de cast as.
  • Dans la branche ok === true, le compilateur doit inférer que res.valeur existe ; dans la branche ok === false, que res.erreur existe.
  • Pas de bibliothèque externe.

Exemple

Pour les appels division(10, 2) puis division(5, 0), sortie attendue :

Résultat : 5
Erreur : division par zéro

Le vrai test est à la compilation : accéder à res.valeur sans avoir vérifié res.ok doit être refusé par tsc.

Espace solution
// À garder en tête
  • D'abord, faire marcher

    On ne cherche pas à optimiser : d'abord, on fait marcher le truc. Optimiser vient ensuite — et ça aussi, ça s'apprend. (Si un défi porte sur l'optimisation, son énoncé le précise.)

  • Pas de mauvaise réponse

    Il n'y a pas de mauvaise réponse à un défi. Le but, c'est de le faire. Ce qui compte, c'est de s'entraîner.

  • Trop dur ? Au suivant

    Un défi te résiste ? N'hésite pas à en prendre un autre. Ils seront encore là demain.