Estou tentando iterar em um mapa datilografado, mas continuo recebendo erros e ainda não consegui encontrar nenhuma solução para um problema tão trivial.
Meu código é:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
E eu recebo o erro:
O tipo 'IterableIteratorShim <[string, boolean]>' não é um tipo de matriz ou de string.
Rastreio de pilha completa:
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)
Estou usando angular-cli beta5 e datilografado 1.8.10 e meu destino é es5. Alguém já teve esse problema?
typescript
iterator
maps
mwe
fonte
fonte
Respostas:
Você poderia usar
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
em vezUse-o assim:
fonte
.forEach
é sub-ideal, já que você não pode quebrá-lo, AFAIKArray.prototype.map
.es6
es5
fonte
Basta usar o
Array.from()
método para convertê-lo em umArray
:fonte
<any>
-castie o mapa para iterá-lo com for-of.Array.from()
estratégia proposta aqui funcionou para mim.Usando as funções Array.from , Array.prototype.forEach () e arrow :
Itere sobre as chaves :
Itere sobre os valores :
Repita as entradas :
fonte
Isso funcionou para mim. Versão TypeScript: 2.8.3
fonte
target
dentro, isso gera um erro, mas funciona corretamente. Você também pode simplesmente fazer quando o direcionamentotsconfig
es5
es6
for (const [key, value] of myMap)
es6
De acordo com as notas de versão
--downlevelIteration
do TypeScript 2.3 em "Novo " :Isso não está ativado por padrão! Adicione
"downlevelIteration": true
ao seutsconfig.json
, ou passe o--downlevelIteration
sinalizador paratsc
, para obter suporte completo ao iterador.Com isso, você pode escrever
for (let keyval of myMap) {...}
ekeyval
o tipo de letra será automaticamente inferido.Por que isso está desativado por padrão? De acordo com o colaborador do TypeScript @aluanhaddad ,
Se você pode segmentar o ES2015 (
"target": "es2015"
intsconfig.json
outsc --target ES2015
) ou mais recente, a ativaçãodownlevelIteration
é fácil, mas se você estiver segmentando o ES5 / ES3, poderá fazer benchmark para garantir que o suporte ao iterador não afete o desempenho (se houver, pode ser melhor com aArray.from
conversão ouforEach
outra solução alternativa).fonte
Isso funcionou para mim.
fonte
Estou usando o TS e o nó mais recentes (v2.6 e v8.9, respectivamente) e posso fazer:
fonte
"downlevelIteration": true
seutsconfig.json
?downlevelIteraton
definido, meu objetivo ées2017
no entanto.Type 'Map<K, V>' is not an array type or a string type.
Você também pode aplicar o método de mapa de matriz ao iterável Map.entries ():
Além disso, conforme observado em outras respostas, pode ser necessário ativar a iteração de nível inferior no tsconfig.json (nas opções do compilador):
fonte
const projected = Array.from(myMap).map(...);
Apenas uma explicação simples para usá-lo em um documento HTML.
Se você possui um Mapa de tipos (chave, matriz), inicializa a matriz da seguinte maneira:
E, para iterar, você cria uma matriz a partir dos valores-chave.
Basta usá-lo como uma matriz como em:
Então, em HTML, você pode usar:
Dentro desse loop, você apenas obtém o valor do array com:
Feito!
fonte
No TypeScript 3.5 e Angular 8 LTS, era necessário converter o tipo da seguinte maneira:
fonte
Se você realmente não gosta de funções aninhadas, também pode percorrer as teclas:
Observe que você precisa filtrar as iterações que não são de chave com
hasOwnProperty
, se não fizer isso, receberá um aviso ou erro.fonte