TypeScript
est basée sur le sous-typage structurel.
Le typage structurel est une façon de relier des types uniquement en fonction de leurs membres.
Ceci est en contraste avec la frappe nominale.C#
ou Java
, le code équivalent serait
une erreur car la classe Person
ne se décrit pas explicitement comme un implémenteur de l'interface Named
.TypeScript
a été conçu en fonction de la manière dont le code JavaScript
est généralement écrit. étant donné que JavaScript
utilise largement des objets anonymes,
tels que les expressions de fonction et les littéraux d'objet, il est beaucoup plus naturel de représenter les types de
relations trouvées dans les bibliothèques JavaScript
avec un système de types structurel au lieu d'un système nominal.TypeScript
permet de sécuriser certaines opérations impossibles à connaître au moment de la compilation.
Lorsqu'un système de types a cette propriété, on dit qu'elle n'est pas "saine".
Les endroits où TypeScript
autorise les comportements non sains ont été soigneusement pris en compte,
et tout au long de ce document, nous expliquerons leur origine et les scénarios de motivation qui s'y cachent.TypeScript
est que x
est compatibilité avec y
si y
a au moins les mêmes membres que x
.y
peut être assigné à x
, le compilateur vérifie chaque propriété de x
pour
trouver une propriété compatible correspondante dans y
. Dans ce cas, y
doit avoir un membre appelé name
qui est une chaîne.
C'est le cas, donc la cession est autorisée.x
est assignable à y
, regardons d'abord la liste des paramètres.
Chaque paramètre x
doit avoir un paramètre correspondant y
avec un type compatible.
Notez que les noms des paramètres ne sont pas pris en compte, mais uniquement leurs types.
Dans ce cas, chaque paramètre de x
a un paramètre compatible correspondant dans y
, donc l'affectation est autorisée.y
un deuxième paramètre requis, x
n'a pas été défini, de sorte que l'affectation est interdite.y = x
.
La raison pour laquelle cette affectation est autorisée est qu'ignorer des paramètres de fonction supplémentaires est assez courant en JavaScript
.
Par exemple, Array#forEach
fournit trois paramètres à la fonction de rappel : l'élément de tableau, son index et le tableau qui le contient.
Néanmoins, il est très utile de fournir un rappel utilisant uniquement le premier paramètre :JavaScript
courants.undefined
à cette position est équivalent pour la plupart des fonctions.TypeScript
est un système de types structurel,
les paramètres de type n'affectent que le type résultant lorsqu'ils sont utilisés avec le type d'un membre.
x
et y
sont compatibles car leurs structures n'utilisent pas l'argument de type de manière différenciante.
Changer cet exemple en ajoutant un membre Empty‹T›
montre comment cela fonctionne :any
à la place de tous les arguments de type non spécifiés.
La compatibilité des types résultants est ensuite vérifiée, comme dans le cas non générique.TypeScript
, il existe deux types de compatibilité: le sous-type et l'affectation.
Celles-ci ne diffèrent que par le fait que l'affectation étend la compatibilité des sous-types avec les règles afin de permettre
l'affectation de any
et vers et de enum
avec les valeurs numériques correspondantes.implements
et extends
.