ProgrammationDéveloppeur TypeScript

Qu'est-ce que les Literal Types en TypeScript et à quoi sont-ils utilisés ? Comment peuvent-ils être utilisés pour mettre en œuvre des restrictions strictes sur les valeurs des variables et quelles sont les pièges lors de leur application ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Literal Types permettent de restreindre les valeurs possibles d'une variable à des constantes précises au lieu d'un type général (par exemple, pas simplement un numéro, mais le nombre 5 ou la chaîne "yes").

Cela est utile pour créer des APIs avec des paramètres fixes, des statuts, etc.

type Direction = 'left' | 'right' | 'up' | 'down'; function move(dir: Direction) { // ... } move('left'); // OK move('top'); // Erreur de compilation !

Ils fonctionnent également avec des nombres, des booléens et même des structures entières (tuple literal type) :

type WeekDay = 1 | 2 | 3 | 4 | 5 | 6 | 7; const day: WeekDay = 6; // OK

Restrictions et nuances :

  • Les types littéraux ne peuvent pas avoir de valeurs assignées implicitement (par exemple, vous ne pouvez pas assigner à une variable de type 'left' | 'right' une chaîne provenant d'une entrée utilisateur sans vérification).
  • Lors de l'utilisation de constantes et de variables let, il est important de se rappeler du type de sortie :
const d = 'left'; // a le type 'left' (Literal) let e = 'left'; // a le type string (normal)

Question piège

Question : Quel type obtiendra la variable si elle est définie comme const x = "yes"; — et peut-on ensuite lui assigner une autre valeur de chaîne ?

Réponse :

  • Si vous déclarez const x = "yes"; — x aura le type "yes" (literal type), et vous ne pourrez pas lui assigner une autre valeur que 'yes' (et vous ne pourrez pas changer, car c'est const).
  • Si vous déclarez let x = "yes";, alors x sera typé comme string, et vous pourrez assigner n'importe quelle chaîne.
const x = 'yes'; // x: 'yes' let y = 'yes'; // y: string

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


Histoire

Dans un projet pour les statuts de tâches, un enum était utilisé, mais le développeur l'a remplacé par string. En conséquence, l'API a commencé à accepter n'importe quelle chaîne comme statut, ce qui a engendré de nombreux bugs lors du développement du produit en production, car le contrôle a été perdu.


Histoire

Un développeur a essayé d'utiliser les types littéraux pour la validation des données, mais a assigné directement des paramètres du champ de formulaire — TS a permis cela, car le type du champ d'entrée était string et non littéral (par exemple, "ok" | "fail"), car les valeurs d'entrée n'avaient pas été vérifiées. Au final, des valeurs qui n'étaient pas dans l'ensemble des valeurs acceptables sont apparues à l'exécution.


Histoire

Lors de l'écriture de tests pour une fonction qui acceptait des valeurs littérales, un test généré automatiquement a accidentellement soumis un paramètre de chaîne inattendu, les tests n'ont pas réussi. Il s'est avéré plus tard que la typage avait été affaibli en raison d'un manque d'attention à la sortie des types lors de la déclaration let, et cela n'a pas été intercepté par le compilateur.