2016-09-23 1 views

Répondre

0

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! 
+3

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. –

6

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 undefinedsont 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 stringsaufnull 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 stringou 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.