Mr Josselin A - TypeScript









Inférence de type

Références

L'actualité

Librairie

L'information

Introduction

Dans cette section, nous couvrirons l'inférence de type dans TypeScript. À savoir, nous discuterons où et comment les types sont déduits.

Les bases

Dans TypeScript, il existe plusieurs endroits où l'inférence de type est utilisée pour fournir des informations sur le type en l'absence d'annotation de type explicite.

Par exemple, dans ce code :

Le type de la variable x est supposé être number. Ce type d'inférence a lieu lors de l'initialisation des variables et des membres, de la définition des valeurs par défaut des paramètres et de la détermination des types de retour de fonction.

Dans la plupart des cas, l'inférence de type est simple. Dans les sections suivantes, nous explorerons certaines des nuances dans la façon dont les types sont déduits.

Meilleur type commun

Lorsqu'une inférence de type est faite à partir de plusieurs expressions, les types de ces expressions sont utilisés pour calculer le «meilleur type commun».

Par exemple,

Pour déduire le type de x dans l'exemple ci-dessus, nous devons considérer le type de chaque élément de tableau. Nous avons ici deux choix pour le type du tableau : number et null. Le meilleur algorithme de type commun considère chaque type de candidat et choisit le type compatible avec tous les autres candidats.

étant donné que le meilleur type commun doit être choisi parmi les types candidats fournis, il existe des cas où les types partagent une structure commune, mais aucun type n'est le super type de tous les types candidats.

Par exemple :

Idéalement, nous pouvons vouloir zoo être déduits en tant que Animal[], mais comme il n'y a pas d'objet strictement de type Animal dans le tableau, nous ne faisons aucune déduction sur le type d'élément de tableau. Pour corriger cela, indiquez explicitement le type quand aucun type n'est un super type de tous les autres candidats :

Lorsqu'aucun meilleur type commun se trouve, l'inférence résultante est le type de réseau d'union, (Rhino | Elephant | Snake)[].

Type contextuel

L'inférence de type fonctionne également dans "l'autre sens" dans certains cas avec TypeScript. Ceci est connu sous le nom de "typage contextuel". Le typage contextuel se produit lorsque le type d'une expression est impliqué par son emplacement.

Par exemple :

Pour que le code ci-dessus donne le type d'erreur, le vérificateur de type TypeScript a utilisé le type de la fonction Window.onmousedown pour déduire le type de l'expression de fonction sur le côté droit de l'affectation. Ce faisant, il était capable de déduire le type du paramètre mouseEvent. Si cette expression de fonction n'était pas dans une position typée contextuellement, le paramètre mouseEvent aurait le type any et aucune erreur n'aurait été émise.

Si l'expression de type contextuel contient des informations de type explicite, le type contextuel est ignoré.
L'expression de fonction avec une annotation de type explicite sur le paramètre remplacera le type contextuel. Une fois que cela est fait, aucune erreur n'est donnée car aucun type de contexte ne s'applique.

Le typage contextuel s'applique dans de nombreux cas. Les cas courants incluent les arguments pour les appels de fonction, les membres de droite des affectations, les assertions de types, les membres des littéraux d'objet et de tableau et les instructions de retour. Le type contextuel agit également en tant que type candidat dans le meilleur type commun.

Par exemple :

Dans cet exemple, le meilleur type commun a un ensemble de quatre candidats: Animal, Rhino, Elephant et Snake. Parmi ceux-ci, Animal peuvent être choisis par le meilleur algorithme de type commun.