Leçons du module (1/2)
Types Conditionnels et infer
Les types conditionnels permettent d'exprimer des des décisions de types non triviales basées sur des relations d'héritage. La syntaxe ressemble à celle de l'opérateur ternaire de JavaScript :
T extends U ? X : YSi le type T est assignable à U, alors le type résultant sera X, sinon ce sera Y.
Types conditionnels de base
Un type conditionnel évalue une condition au niveau du type de manière statique :
type IsNumber<T> = T extends number ? true : false;
type A = IsNumber<number>; // true
type B = IsNumber<string>; // falseCe motif est extrêmement puissant lorsqu'il est combiné avec des génériques pour créer des types d'utilité flexibles et dynamiques.
Extraction de types avec infer
À l'intérieur de la clause extends d'un type conditionnel, nous pouvons utiliser le mot-clé infer pour déclarer une variable de type qui doit être déduite par le compilateur.
Par exemple, si nous voulons extraire le type de retour d'une fonction :
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type FunzioneEsempio = () => string;
type Ritorno = GetReturnType<FunzioneEsempio>; // stringDans cet exemple, infer R indique à TypeScript de déduire automatiquement le type de retour de la fonction et de le rendre disponible sous la forme R dans la branche positive de la condition.
À vous de jouer
Exercice 1 : Le type IsString
Créez un type générique appelé IsString<T> qui renvoie le type littéral true si T étend string, sinon false.
Afficher l'indice
Utilisez la syntaxe type IsString<T> = T extends string ? true : false; pour vérifier le type.
Solution disponible après 3 tentatives
Exercice 2 : Extraire le type d'un tableau avec infer
Définissez un type générique UnpackArray<T> qui utilise infer pour extraire le type des éléments d'un tableau T. Si T est un tableau (par exemple U[]), il renvoie U, sinon il renvoie le même type T.
Afficher l'indice
Utilisez T extends (infer U)[] ? U : T pour déclarer et renvoyer la variable de type déduite U.
Solution disponible après 3 tentatives