Présentation des discriminated union types en Typescript
Les discriminated union types en Typescript offrent une puissante abstraction pour gérer différentes variantes de données de manière sûre et efficace.
Dans cet article, nous allons explorer en détail ce que sont les discriminated union types et comment les utiliser dans un environnement React & Next.js, en fournissant des exemples concrets.
Qu'est-ce qu'un discriminated union type ?
Un discriminated union type en Typescript est une technique qui permet de définir un type qui peut représenter plusieurs variantes de valeurs, mais avec un moyen clair de distinguer entre ces variantes.
Cela se fait en utilisant une propriété commune à toutes les variantes, souvent appelée discriminant. Cela offre un moyen élégant de manipuler des données polymorphiques tout en profitant du système de typage statique de Typescript.
Dans cet exemple, Shape est un discriminated union type qui peut représenter trois types différents de formes géométriques : cercle, carré et triangle. Chaque variante de Shape est distinguée par la propriété kind, qui agit comme un discriminant. Les types Circle, Square et Triangle définissent les propriétés spécifiques de chaque forme, telles que radius pour un cercle, sideLength pour un carré et ainsi de suite.
La fonction calculateArea prend une forme (Shape) en paramètre et utilise un switch sur la propriété kind pour déterminer le type spécifique de la forme et calculer son aire en conséquence.
Cet exemple démontre comment un discriminated union type peut être utilisé pour manipuler différentes variantes de données de manière sûre et précise, en permettant à Typescript de déterminer le type spécifique de chaque instance en fonction de la valeur de son discriminant.
Dans les prochains exemples, nous allons voir comment utiliser les discriminated union types dans un environnement React & Next.js.
Appel API versionné
L'un des premiers cas d'usage des discriminated union types en front-end est la gestion des appels API versionnés. Il peut arriver que vous ayez une API qui renvoie des réponses différentes en fonction de la version demandée. Vous pouvez utiliser un discriminated union type pour modéliser ces différentes réponses et les traiter de manière appropriée dans votre application Next.js.
Pour cet exemple, nous souhaitons afficher les informations de l'utilisateur récupérées à partir de l'API dans notre application. Nous pouvons utiliser un discriminant union type pour gérer les différentes versions de données de l'utilisateur et les afficher en conséquence.
Voici un exemple de composant React utilisant le discriminant union type pour afficher les informations de l'utilisateur :
Dans cet exemple, le composant UserInfo appelle l'API en utilisant la fonction getUser avec la version spécifiée. Une fois les données récupérées, il affiche les informations de l'utilisateur en fonction de la version de données reçue.
Il utilise le discriminant version du state userData pour déterminer quelle version de données de l'utilisateur est reçue et affiche les informations appropriées en conséquence.
Ainsi, grâce à un discriminaeted union type, vous pouvez gérer différentes versions de votre API de manière sûre et précise dans votre application Next.js.
Gestion des états dans un composant React
Un autre cas d'usage des discriminated union type en front-end est la gestion des états d'un composant React tels que "chargement", "erreur" ou "succès".
Dans cet exemple, le composant MyComponent utilise un discriminated union type pour modéliser les différents états possibles, tels que loading, success et error, et affiche le contenu du composant en fonction de l'état. Ici, le discriminant est le champ status.
Gestion des actions dans une application Next.js
Une librairie populaire qui utilise les discriminated union types est Redux avec ses types d'actions.
Dans cet exemple, nous utilisons un discriminated union type pour définir les différents types d'actions TodoAction. Chaque action a un type spécifique type et éventuellement des données payload. Nous utilisons également des action creators pour créer des actions.
Dans le reducer, nous utilisons le discriminated union type pour filtrer les différentes actions et exécuter la logique appropriée en fonction du type d'action.
En utilisant un discriminated union type, nous pouvons garantir que toutes les actions sont correctement typées et que Redux peut inférer automatiquement le type de l'action et du state dans les reducers et les action creators. Cela rend le code plus sûr et plus facile à maintenir.
Gestion des variants de contenu dans les composants React
Il peut arriver que nous devions gérer des variants d'un contenu dans nos composants React, comme par exemple des médias.
Comme pour les autres exemples, nous utilisons un discriminant représenté ici par le champ type pour afficher correctement les différents types de média.
Conclusion
Les discriminated union types sont une fonctionnalité puissante de Typescript qui permettent de modéliser des types de données complexes et variés de manière concise et sûre. Que ce soit pour modéliser différentes versions de réponses API, gérer les états des composants React, définir des actions Redux ou représenter des variantes de contenu, les discriminated union types offrent une solution qui rend le code plus robuste, plus lisible et évite des erreurs.
Grâce à leur capacité à distinguer les différentes variantes de données en fonction de leur discriminant, les discriminated union types garantissent une manipulation sûre et précise des données dans les projets front-end. Ils facilitent également la maintenance du code en fournissant une documentation claire et en permettant à Typescript d'effectuer une vérification statique approfondie du code.
Pour conclure, les discriminated union types sont un outil essentiel pour les développeurs front-end Typescript qui cherchent à créer des applications robustes et maintenables. En les utilisant de manière judicieuse, les développeurs gagnent en lisibilité et en qualité de code pour leurs projets React et Next.js.