Itération sur Tapuscrit Carte
Je suis en train de parcourir un fichier d'enregistrement de la carte, mais je continue à recevoir des erreurs et je ne pouvais pas trouver un solution mais pour un banal problème.
Mon code est:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
Et j'obtiens l'Erreur:
Type 'IterableIteratorShim<[string, boolean]>" n'est pas un tableau de type ou d'un type de chaîne.
Full Stack Trace:
Error: Typescript found the following errors:
/home/project/tmp/broccoli_type_script_compiler-input_base_path-q4GtzHgb.tmp/0/src/app/project/project-data.service.ts (21, 20): Type 'IterableIteratorShim<[string, boolean]>' is not an array type or a string type.
at BroccoliTypeScriptCompiler._doIncrementalBuild (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:115:19)
at BroccoliTypeScriptCompiler.build (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:43:10)
at /home/project/node_modules/broccoli-caching-writer/index.js:152:21
at lib$rsvp$$internal$$tryCatch (/home/project/node_modules/rsvp/dist/rsvp.js:1036:16)
at lib$rsvp$$internal$$invokeCallback (/home/project/node_modules/rsvp/dist/rsvp.js:1048:17)
at lib$rsvp$$internal$$publish (/home/project/node_modules/rsvp/dist/rsvp.js:1019:11)
at lib$rsvp$asap$$flush (/home/project/node_modules/rsvp/dist/rsvp.js:1198:9)
at _combinedTickCallback (internal/process/next_tick.js:67:7)
at process._tickCallback (internal/process/next_tick.js:98:9)
Je suis en utilisant angulaires-cli beta5 et tapuscrit 1.8.10 et mon objectif est es5.
Quelqu'un a eu ce Problème?
- Voir cette réponse à partir de github github.com/Microsoft/TypeScript/issues/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
au lieuL'utiliser comme ceci:
.forEach
est sous-optimale, puisque vous ne pouvez pas le casser , autant que je sacheArray.prototype.map
.Suffit d'utiliser la Matrice.à partir de() la méthode pour convertir un Tableau:
<any>
-cast la carte de le parcourir avec pour-de.Array.from()
stratégie proposée ici fait un travail pour moi.À l'aide de Tableau.à partir de, Tableau.le prototype.forEach(), et flèche fonctions:
Itérer sur les clés:
Itérer sur les valeurs:
Itérer sur les entrées:
Cela a fonctionné pour moi. Tapuscrit Version: 2.8.3
target
danstsconfig
estes5
cela déclenche une erreur, mais aveces6
fonctionne correctement. Vous pouvez aussi simplement fairefor (const [key, value] of myMap)
lors du ciblage dees6
Par la Tapuscrit 2.3 notes de version sur le Nouveau
--downlevelIteration
":Ce n'est pas activée par défaut! Ajouter
"downlevelIteration": true
à votretsconfig.json
, ou passer--downlevelIteration
drapeau àtsc
, d'obtenir la pleine itérateur de soutien.Dans ce lieu, vous pouvez écrire
for (let keyval of myMap) {...}
etkeyval
's type sera automatiquement déduit.Pourquoi est-ce désactivée par défaut? Selon Tapuscrit contributeur @aluanhaddad,
Si vous pouvez cibler ES2015 (
"target": "es2015"
danstsconfig.json
outsc --target ES2015
) ou plus tard, permettantdownlevelIteration
est une évidence, mais si vous ciblez ES5/ES3, vous risquez de référence pour assurer l'itérateur de soutien n'a pas d'impact sur les performances (si c'est le cas, vous pourriez être mieux avecArray.from
de conversion ou deforEach
ou une autre solution de contournement).Je suis en utilisant les dernières TS et le nœud (v2.6 et v8.9 respectivement) et je peux le faire:
"downlevelIteration": true
dans votretsconfig.json
?downlevelIteraton
ensemble, mon objectif estes2017
cependant.Type 'Map<K, V>' is not an array type or a string type.
Cela a fonctionné pour moi.
Juste explication simple de le faire à partir de l'HTML si vous avez une Carte de types (clé, array):
J'initialise le tableau de cette façon:
Et pour itérer sur elle, j'ai créer un tableau de valeurs de clé:
- juste l'utiliser comme un tableau avec : des clefs = Array.(ceci.cityShop.keys());
Puis, dans le HTML, je peux utiliser:
À l'intérieur de ce bucle, je viens d'obtenir le tableau de la valeur avec cette.cityShop.get(clé)
Et... fait!
Si vous n'avez pas vraiment comme des fonctions imbriquées, vous pouvez également effectuer une itération sur les touches:
Note, vous devez filtrer les non-clé itérations avec la
hasOwnProperty
, si vous ne le faites pas, vous obtiendrez un avertissement ou une erreur.