ProgrammationDéveloppeur Frontend / Développeur Fullstack

Comment fonctionne le système d'inférence de types dans TypeScript ? Quels sont les niveaux d'inférence de types et quelles erreurs peut-on commettre en comptant sur l'intelligence du compilateur ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Inférence simple : lors de la déclaration de variables sans type explicite
  • Inférence contextuelle : lorsque le type de l'expression est déterminé par le contexte (par exemple, le gestionnaire d'événements)
  • Type commun le meilleur : pour les tableaux avec des éléments de différents types, on recherche le type le plus général

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.

Question piège

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 }

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


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.