TypeScript possède un puissant système d'inférence de types. Dans la plupart des cas, les types des variables, paramètres et valeurs de retour sont calculés automatiquement en fonction du contexte. Il existe plusieurs niveaux d'inférence de types :
Exemples :
let a = 2; // number let b = [1, "a"]; // (number | string)[] window.addEventListener('click', e => { // e: MouseEvent });
Limitation : si le compilateur ne peut pas inférer le type de manière univoque, il choisira le type le plus large (généralement any), ce qui prive des avantages de la typage.
Le type d'un argument de fonction est-il typé si cela n'est pas spécifié explicitement, mais que la fonction est ensuite utilisée avec une valeur typée ?
Mauvaise réponse : Oui, TypeScript devine toujours automatiquement le type de l'argument.
Bonne réponse : Non. Ce n'est que si le contexte de la fonction contient des informations sur le type que l'argument obtiendra un type. Sinon, il sera any ou un autre type de base, ce qui entraînera des erreurs. Il est toujours préférable de typiser explicitement les entrées.
Exemple :
function f(x) { return x.toFixed(2); // Erreur : x est de type any }
Histoire
Dans le projet, le type de retour d'un hook personnalisé React n'a pas été spécifié explicitement, et TypeScript n'a pas vu que le type pouvait être
undefined. En conséquence, l'appel d'une méthode sur l'objet sans contrôle entraînait des erreurs d'exécution.
Histoire
En créant un tableau de valeurs de types mixtes, le type final a été automatiquement inféré comme un tableau
any[], car aucun type n'a été spécifié, ce qui a entraîné une perte de tous les avantages de la typage dans le code ultérieur.
Histoire
La validation des paramètres d'entrée du service n'était pas typée et comptait sur l'"intuition" de TypeScript. Après le refactoring du code, l'inférence automatique a donné un type trop général, et des erreurs de type ont atteint la production.