J'essaie d'itérer sur une carte dactylographiée mais je continue à recevoir des erreurs et je n'ai pas encore trouvé de solution pour un problème aussi trivial.
Mon code est:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
Et j'obtiens l'erreur:
Le type 'IterableIteratorShim <[string, boolean]>' n'est pas un type de tableau ou un type de chaîne.
Trace complète de la pile:
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)
J'utilise angular-cli beta5 et dactylographié 1.8.10 et ma cible est es5. Est-ce que quelqu'un a eu ce problème?
Réponses:
Vous pouvez utiliser à la
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
placeUtilisez-le comme ceci:
la source
.forEach
est sous-optimal, car vous ne pouvez pas le casser, AFAIKArray.prototype.map
.es6
es5
la source
Utilisez simplement la
Array.from()
méthode pour le convertir enArray
:la source
<any>
lancer la carte pour l'itérer avec for-of.Array.from()
stratégie proposée ici a fonctionné pour moi.Utilisation des fonctions Array.from , Array.prototype.forEach () et flèche :
Parcourez les touches :
Répétez les valeurs :
Parcourez les entrées :
la source
Cela a fonctionné pour moi. Version TypeScript: 2.8.3
la source
target
entsconfig
estes5
cela jette une erreur, maises6
fonctionne correctement. Vous pouvez aussi simplement le fairefor (const [key, value] of myMap)
lors du ciblagees6
Selon les notes de publication de TypeScript 2.3 sur "Nouveau
--downlevelIteration
" :Ce n'est pas activé par défaut! Ajoutez
"downlevelIteration": true
à votretsconfig.json
, ou passez l'--downlevelIteration
indicateur àtsc
, pour obtenir une prise en charge complète de l'itérateur.Avec cela en place, vous pouvez écrire
for (let keyval of myMap) {...}
etkeyval
le type de sera automatiquement déduit.Pourquoi est-ce désactivé par défaut? Selon le contributeur TypeScript @aluanhaddad ,
Si vous pouvez cibler ES2015 (
"target": "es2015"
danstsconfig.json
outsc --target ES2015
) ou une version ultérieure, l'activationdownlevelIteration
est une évidence, mais si vous ciblez ES5 / ES3, vous pouvez effectuer une analyse comparative pour vous assurer que la prise en charge de l'itérateur n'affecte pas les performances (si c'est le cas, vous pourriez être mieux avec laArray.from
conversion ouforEach
une autre solution de contournement).la source
Cela a fonctionné pour moi.
la source
J'utilise le dernier TS et le dernier nœud (v2.6 et v8.9 respectivement) et je peux faire:
la source
"downlevelIteration": true
votretsconfig.json
?downlevelIteraton
fixé, mon objectif l'estes2017
cependant.Type 'Map<K, V>' is not an array type or a string type.
Vous pouvez également appliquer la méthode de carte de tableau à l'itérable Map.entries ():
De plus, comme indiqué dans d'autres réponses, vous devrez peut-être activer l'itération de bas niveau dans votre tsconfig.json (sous les options du compilateur):
la source
const projected = Array.from(myMap).map(...);
Juste une explication simple pour l'utiliser dans un document HTML.
Si vous avez une carte de types (clé, tableau), vous initialisez le tableau de cette façon:
Et pour l'itérer, vous créez un tableau à partir de valeurs clés.
Utilisez-le simplement comme un tableau comme dans:
Ensuite, en HTML, vous pouvez utiliser:
Dans cette boucle, vous obtenez simplement la valeur du tableau avec:
Terminé!
la source
Sur Typescript 3.5 et Angular 8 LTS, il était nécessaire de convertir le type comme suit:
la source
Si vous n'aimez pas vraiment les fonctions imbriquées, vous pouvez également parcourir les touches:
Notez que vous devez filtrer les itérations non clés avec le
hasOwnProperty
, si vous ne le faites pas, vous obtenez un avertissement ou une erreur.la source