Passer au contenu principal
eLearner.app
Module 6 · Leçon 2 sur 212/14 dans le cours~15 min
Leçons du module (2/2)

Types Mappés

Les types mappés permettent de créer de nouveaux types à partir de types existants, en transformant les propriétés une par une. Ils sont basés sur la syntaxe des boucles sur les clés, en utilisant l'opérateur keyof.

TS
type Mapped<T> = {
  [P in keyof T]: T[P];
};

Cet exemple est un type mappé identique à l'original : il parcourt chaque clé P dans keyof T et lui affecte le même type T[P].


Modificateurs de mutabilité et d'optionalité

Nous pouvons ajouter ou supprimer des modificateurs comme readonly et ? (optionalité) en faisant précéder par + (ajouter, par défaut) ou - (supprimer).

Par exemple, pour supprimer l'optionalité de toutes les propriétés d'un type (les rendant obligatoires) :

TS
type Concrete<T> = {
  [P in keyof T]-?: T[P];
};

Le modificateur -? supprime le drapeau d'optionalité de chaque propriété.


Remappage des clés avec as

Dans TypeScript 4.1+, il est possible de remapper les clés d'un type mappé en utilisant la clause as et les types littéraux de modèles (template literal types).

TS
type ScriviSetters<T> = {
  [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};

Ici, nous changeons le nom de chaque propriété K en set[CléCapitalisée] et changeons son type en une fonction setter.


À vous de jouer

Exercice 1 : Rendre les propriétés nullables

Exercice#ts.m6.l2.e1
Tentatives : 0Chargement…

Déclarez un type mappé générique Nullable<T> qui prend un objet T et transforme chacune de ses propriétés afin qu'elle puisse également accepter la valeur null (ex. T[K] | null).

Chargement de l'éditeur…
Afficher l'indice

Utilisez la syntaxe [K in keyof T]: T[K] | null; à l'intérieur de l'objet du type mappé.

Solution disponible après 3 tentatives

Exercice 2 : Générer des Getters dynamiques avec as

Exercice#ts.m6.l2.e2
Tentatives : 0Chargement…

Créez un type mappé appelé GetterNames<T> qui transforme les clés de l'objet T en ajoutant le préfixe 'get' en capitalisant la clé d'origine (utilisez Capitalize). Par exemple, si une clé est name, elle deviendra getName. Définissez le type des propriétés sur () => T[K].

Chargement de l'éditeur…
Afficher l'indice

Utilisez as \`get\${Capitalize<string & K>}\` pour remapper la clé et () => T[K] comme type de retour de la propriété.

Solution disponible après 3 tentatives