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
const d = 'left'; // a le type 'left' (Literal) let e = 'left'; // a le type string (normal)
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 :
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).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
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.