Code dactylographié qui ne prend pas en compte la possibilité que des éléments de tableau renvoient un résultat indéfini
P粉824889650
P粉824889650 2023-08-24 12:15:44
0
2
681
<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>
P粉824889650
P粉824889650

répondre à tous(2)
P粉194541072

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.

P粉330232096

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 :

const list: (Item | undefined)[] = [{ id: 'a' }, { id: 'b' }];

Cela fonctionnera comme prévu sans affecter la langue entière.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal