L'Assignabilité en TypeScript

Qu'est-ce que l'assignabilité ?

L'assignabilité en TypeScript décrit la capacité à attribuer une valeur d'un certain type de données à une variable d'un type identique ou différent. Cela devient crucial lors de diverses opérations où des données sont transférées, notamment lors de l'affectation de valeurs à des variables ou lors du passage d'arguments à des fonctions.

Quand l'assignabilité se manifeste

TypeScript effectue des contrôles d'assignabilité chaque fois qu'une valeur est assignée à une autre zone de la mémoire. Cela inclut des situations comme :

  • L'assignation de valeurs à des variables.
  • La transmission d'arguments aux fonctions.

Exemple d'assignation de types compatibles

Considérons le code suivant : ici, la variable spooky est d'abord assignée une valeur de type booléen. Par conséquent, TypeScript impose que spooky reste un booléen.

let spooky = true;
spooky = false; // Autorisé
spooky = 'skeletons'; // Non autorisé

Si l'on exécute ce code, une erreur sera déclenchée :

Erreur : Le type 'string' ne peut pas être assigné au type 'boolean'.

Exemples : Comparaison des types d'objet

Lorsqu'il s'agit de comparer des types d'objet, TypeScript vérifie que toutes les propriétés nécessaires sont présentes dans l'objet que l'on souhaite assigner. De plus, il s'assure que tous les types correspondent.

Dans l'exemple suivant, nous définissons une interface appelée Skeleton, qui organisera les propriétés avec leurs types définis :

interface Skeleton {
  spooky: boolean;
  scary: boolean;
}

function receiveSkeleton(skeleton: Skeleton) {
  console.log(skeleton.spooky ? 'Spooky ' : 'Not spooky...');
  console.log(skeleton.scary ? 'scary!' : 'Not scary...');
}

receiveSkeleton({ spooky: true, scary: false }); // Ok

Dans cet exemple, la première fonction receiveSkeleton() fonctionne parce que l'objet passé comprends les propriétés requises spooky et scary avec les types corrects.

Gestion des erreurs d'assignabilité

Dans les deux exemples suivants, une erreur sera générée lorsque l'on ne respecte pas les types attendus :

  1. Dans ce cas, spooky est de type string au lieu de boolean : typescript receiveSkeleton({ spooky: 'Very!', scary: true }); L'erreur sera : Erreur : Le type 'string' ne peut pas être assigné au type 'boolean'.
  2. Dans ce dernier exemple, l'objet passé à receiveSkeleton() ne possède pas la propriété scary requise : typescript receiveSkeleton({ spooky: false }); Cela engendrera l'erreur suivante : Erreur : Argument du type '{ spooky: false; }' non assignable au paramètre de type 'Skeleton'. La propriété 'scary' est manquante dans le type '{ spooky: false; }' mais requise dans le type 'Skeleton'.