Je sais que l'explication générale est que le compilateur effectue une vérification de type statique, mais quelles méthodes le compilateur utilise-t-il spécifiquement pour vérifier qu'aucun type nullable ne se déclenche accidentellement?Comment Typescript 2 applique-t-il les types non-nullable?
Répondre
TypeScript est complètement compile côté; tout le typage statique est perdu quand il est converti en JavaScript. Il n'y a rien qui vous empêche de faire quelque chose comme:
let foo: { myProperty: string } = { myProperty: "g" }; // myProperty is non-nullable
foo["myProperty"] = undefined; // bypass type checker!
La vérification de la nullabilité/undefinedness est juste un changement dans la façon dont les types de modèles de système de type. Comme d'habitude, tout cela se passe pendant la phase de vérification de typage et il n'y a rien dans le JavaScript émis pour l'appliquer à l'exécution.
Quoi qu'il en soit, vous pouvez penser à un type comme domaine de valeurs. Par exemple, le domaine de boolean
est généralement juste les deux valeurs true
et false
. string
est un domaine non borné qui contient des chaînes telles que "hello"
et "world"
et toutes les autres chaînes.
TypeScript vérifie que lorsqu'une valeur est utilisée dans une position de type, cette valeur est dans le domaine de ce type. Par exemple, true
n'est pas dans le domaine number
, il est donc illégal d'essayer d'utiliser true
où un number
est attendu.
dactylographiée sans vérification stricte null, null
et undefined
sont dans le domaine de tous les types. Donc, le type boolean
a effectivement quatre valeurs: true
, false
, undefined
, et null
. Comme les gens découvrent habituellement, c'est mauvais, parce que undefined
et null
ne se comportent pas exactement comme true
et false
. Pour les choses avec des propriétés et des méthodes, c'est pire, car substr
existe comme une méthode de chaque valeur dans le domaine de string
saufnull
et undefined
, donc c'est vraiment ennuyeux.
dactylographiée avec vérification stricte null, null
et undefined
déplacer hors du domaine de chaque type et dans leurs propres types. Or, la valeur null
ne peut pas être utilisée dans un endroit où un string
est attendu, car ce n'est plus dans le domaine string
. Le type string | null
représente maintenant une valeur qui peut être un membre du domaine string
ou la valeur spéciale null
.
Cette explication est adaptée de Anders Hejlsberg's talk from Build 2016 starting around 44:30 et comme vous pouvez l'imaginer, il fait un meilleur travail pour l'expliquer que moi, surtout parce qu'il a de belles diapositives pour l'accompagner.
Cela est correct, mais ce code génère une erreur de compilation avec une vérification stricte des valeurs nulles: «Le type indéfini n'est pas assignable à la chaîne de caractères. Il ne contourne pas le vérificateur de type. –