61 votes

la propriété forEach n'existe pas sur le type NodeListOf

Angular 2.4.4, TypeScript 2.1.5, PhpStorm 2017.2.1 J'écris ce code :

const list = document.querySelectorAll('path.frame-zone');
list.forEach(() => {

Mais la deuxième ligne est soulignée par une ligne rouge et TsLint rapporte que "la propriété forEach n'existe pas sur le type NodeListOf". Mais lorsque je ctrl+clique sur la propriété forEach ça me permet de lib.es6.d.tsforEach est déclaré pour interface NodeListOf<TNode extends Node>

Pourquoi je ne peux pas l'utiliser ? Quel est le problème ?

0 votes

Quelle librairie utilisez-vous ? Est-ce es6 ou utilisez-vous une version plus ancienne ?

0 votes

Qu'est-ce que la lib dans ce contexte ? Je maintiens un ancien projet d'une autre équipe. Peut-être que quelque chose est mal configuré mais je ne sais pas où regarder.

0 votes

Dans votre tsconfig.json. Quelle est la bibliothèque utilisée par votre projet ?

118voto

Derek Points 1462

Vous devez le convertir en tableau :

const frameZones = Array.from(document.querySelectorAll('path.frame-zone'));
frameZones.forEach((...) => {});

0 votes

Correct ou non, au moins, ça aide. Je n'en suis pas sûr. La question reste en fait ouverte. Pourquoi PhpStorm prétend-il avoir cette méthode ?

3 votes

En fait, avec ES6, on peut s'en approcher encore plus facilement : const frameZones = [...document.querySelectorAll('path.frame-zone')]; A la vôtre !

39voto

tibalt Points 625

Il suffit d'ajouter "dom.iterable" a tsconfig.json de sorte que cela ressemble un peu à ceci :

{
    "compilerOptions": {
        "lib": [
            "es6",
            "dom",
            "dom.iterable"
        ],
...

1 votes

Je suis prêt à accepter cela si cela résout le problème initial.

0 votes

Sinon, il suffit de le faire : "compilerOptions": { "target": "es2015" }

0 votes

Il est important de mentionner que si vous ciblez es2015, votre bundle peut ne pas fonctionner correctement sur les anciens navigateurs. C'est peut-être une solution (je n'ai pas essayé) mais cela a des conséquences

14voto

Buksy Points 687

Vous pouvez le caster pour que le compilateur sache qu'il peut être itéré :

(document.querySelectorAll('path.frame-zone') as any as Array<HTMLElement>).forEach();

-3voto

Mars Points 63

Essayer de le lancer :

const list = (NodeListOf) document.querySelectorAll('path.frame-zone');

ah tapuscrit peut-être comme ça :

const list = <NodeListOf> document.querySelectorAll('path.frame-zone');

1 votes

J'ai essayé ça. Ça ne sert à rien. Lint sait déjà de quel type il s'agit.

0 votes

Type son NodeListOf ou NodeList ! ?

0 votes

C'est NodeListOf

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X