Code dactylographié qui ne prend pas en compte la possibilité que des éléments de tableau renvoient un résultat indéfini
P粉824889650
2023-08-24 12:15:44
<p>Le code suivant passe dans le vérificateur de type Typescript (v2.9.1), mais renvoie <code>TypeError</code> </p>
<pre class="brush:php;toolbar:false;">élément d'interface { id: string }
liste const : Item[] = [{ id : 'a' }, { id : 'b' }] ;
const item = list[3]; // Type : élément
const itemId = item.id; // Type : chaîne</pre>
<p>Considérant que l'accès à un élément dans un tableau typé peut toujours renvoyer <code>undefined</code>, <code>item</code> doit être <code>item : Item | , ce qui vous obligera à faire une vérification nulle, n'est-ce pas ? </p>
<p>Ce qui m'a encore plus surpris, c'est que le code suivant a également réussi la vérification de type : </p>
<pre class="brush:php;toolbar:false;">const item2 : élément non défini = liste[3] ;
const item2Id = item2.id;</pre>
<p>Bien que la conversion de la valeur de retour entraîne l'échec de la vérification du type : </p>
<pre class="brush:php;toolbar:false;">const item3 = list[3] comme élément non défini ;
const item3Id = item3.id; // [ts] L'objet est peut-être « non défini ».</pre>
<p>La création d'une fonction d'accesseur explicitement typée peut également capturer la situation <code>undefined</code>, mais cela ajoutera une surcharge inutile : </p>
<pre class="brush:php;toolbar:false;">const getItem1 = (index : nombre, éléments : élément[]) : élément non défini => éléments[index] ;
const item3 = getItem1(3, liste);
const item3Id = item3 && item3.id;</pre>
<p>Est-ce une limitation connue de Typescript ? Existe-t-il un modèle ou une bibliothèque recommandé pour gérer cette situation ? </p>
Il s'agit d'un comportement intentionnel. Voir la longue discussion sur ce problème sur le référentiel TypeScript GitHub
Votre
strictNullChecks
est fermé ; essayez de l'ouvrir.Mise à jour TS 4.1 :
TypeScript 4.1 introduit un
--noUncheckedIndexedAccess
编译器标志,实现了在microsoft/TypeScript#13778中提出的建议,以考虑这种情况下的undefined
。请注意,该功能不会作为--strict
编译选项集的一部分启用,并且被称为“严格的索引签名”,因为它会在程序员可能不希望或期望的情况下发出关于undefined
avertissement.Réponse avant TS4.1 :
Vous avez découvert que les signatures d'index n'ajoutent pas
| undefined
aux types d'éléments comme le font les attributs facultatifs. Il a été suggéré de créer une option de compilateur pour y parvenir sur microsoft/TypeScript#13778. Vous pouvez lire les commentaires dans cette suggestion ; ils renvoient à d'autres questions, mais le consensus est que le taux d'erreur élevé la rend presque inutile.mentionne également que vous pouvez ajouter manuellement
| undefined
au type d'élément :Cela fonctionnera comme prévu sans affecter la langue entière.