Estoy tratando de iterar sobre un mapa mecanografiado, pero sigo recibiendo errores y todavía no puedo encontrar ninguna solución para un problema tan trivial.
Mi código es:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
Y me sale el error:
El tipo 'IterableIteratorShim <[string, boolean]>' no es un tipo de matriz o un tipo de cadena.
Seguimiento completo de la pila:
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)
Estoy usando angular-cli beta5 y typecript 1.8.10 y mi objetivo es es5. ¿Alguien ha tenido este problema?
typescript
iterator
maps
mwe
fuente
fuente
Respuestas:
Podrías usar
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
en su lugarÚselo así:
fuente
.forEach
es subóptimo, ya que no puedes romperlo, AFAIKArray.prototype.map
.es6
es5
fuente
Solo usa el
Array.from()
método para convertirlo aArray
:fuente
<any>
emite el mapa para iterarlo con for-of.Array.from()
estrategia propuesta aquí funcionó para mí.Usando Array.from , Array.prototype.forEach () y funciones de flecha :
Iterar sobre las teclas :
Iterar sobre los valores :
Iterar sobre las entradas :
fuente
Esto funcionó para mí. Versión de TypeScript: 2.8.3
fuente
target
entsconfig
eses5
esto arroja un error, pero cones6
las obras correctamente. También puede hacerlofor (const [key, value] of myMap)
cuando apuntaes6
Según las notas de la versión de TypeScript 2.3 en "Nuevo
--downlevelIteration
" :¡Esto no está habilitado por defecto! Agregue
"downlevelIteration": true
a sutsconfig.json
, o pase la--downlevelIteration
bandera atsc
, para obtener soporte completo para el iterador.Con esto en su lugar, puede escribir
for (let keyval of myMap) {...}
ykeyval
el tipo se deducirá automáticamente.¿Por qué está desactivado por defecto? Según el colaborador de TypeScript @aluanhaddad ,
Si puede apuntar a ES2015 (
"target": "es2015"
entsconfig.json
otsc --target ES2015
) o posterior, la habilitacióndownlevelIteration
es obvia, pero si está apuntando a ES5 / ES3, puede hacer una referencia para asegurarse de que el soporte del iterador no afecte el rendimiento (si lo hace, podría ser mejor apagado conArray.from
conversión oforEach
alguna otra solución).fuente
Esto funcionó para mí.
fuente
Estoy usando el último TS y nodo (v2.6 y v8.9 respectivamente) y puedo hacer:
fuente
"downlevelIteration": true
tutsconfig.json
?downlevelIteraton
establecido, mi objetivo eses2017
sin embargo.Type 'Map<K, V>' is not an array type or a string type.
También puede aplicar el método de mapa de matriz a Map.entries () iterable:
Además, como se señaló en otras respuestas, es posible que deba habilitar la iteración de nivel inferior en su tsconfig.json (en las opciones del compilador):
fuente
const projected = Array.from(myMap).map(...);
Solo una explicación simple para usarlo en un documento HTML.
Si tiene un Mapa de tipos (clave, matriz), entonces inicialice la matriz de esta manera:
Y para iterar sobre él, crea una matriz a partir de valores clave.
Solo úsalo como una matriz como en:
Luego, en HTML, puede usar:
Dentro de este ciclo, solo obtienes el valor de la matriz con:
¡Hecho!
fuente
En Typecript 3.5 y Angular 8 LTS, se requería emitir el tipo de la siguiente manera:
fuente
Si realmente no le gustan las funciones anidadas, también puede iterar sobre las teclas:
Tenga en cuenta que debe filtrar las iteraciones no clave con
hasOwnProperty
, si no lo hace, recibirá una advertencia o un error.fuente