Dans certains cas on défini un type TypeScript regroupant plusieurs types d'évènements et leur variables associées. Ou parfois c'est juste un type d'objet et la données associée.
Par exemple on pourrait définir une liste de types de cartes à afficher sur une page d'accueil d'une application mobile.
On aurait par exemple :
Chacune des carte ayant des données spécifiques à son type.
L'interface définissant cela pourrait être la suivante :
À partir d'ici je souhaite throw une erreur si jamais l'évènement traité par mon code n'est pas celui que j'attends j'écrirais généralement le code. Concrètement dans un bloc de code cela pourrait se représenter de la sorte :
Problème, cela commence à devenir un petit peu verbeux et on se rend bien compte que l'on à tendance à répéter le même code avec le throw.
Comment faire pour extrait ce morceau de code et continuer de profiter de la sécurisation du type ?
Cette fonction a maintenant un paramètre de type générique T qui est contraint par l'union des propriétés de type dans TimelineCardsType (Types Génériques).
La valeur de retour est asserts element is ce qui signifie qu'une exception doit être levée si l'élément (la carte) n'est pas du type indiqué. (Fonctions d'assertion).
TimelineCardsType & { type : T } signifie que l'union de tous les éléments est filtrée pour ne retenir que ceux qui correspondent au type passé en tant que expectedType. (Types d'intersection)
Désormais, cette fonction fonctionne sans problème et de cette manière on économise/factorise quelques lignes ;)