Próbuję iterować po mapie maszynopisu, ale ciągle pojawiają się błędy i nie mogłem jeszcze znaleźć rozwiązania dla tak trywialnego problemu.
Mój kod to:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
I otrzymuję błąd:
Typ „IterableIteratorShim <[string, boolean]>” nie jest tablicą ani ciągiem.
Pełny ślad stosu:
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)
Używam angular-cli beta5 i maszynopisu 1.8.10, a moim celem jest es5. Czy ktoś miał ten problem?
typescript
iterator
maps
mwe
źródło
źródło
Odpowiedzi:
Możesz
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
zamiast tego użyćUżyj tego w ten sposób:
źródło
.forEach
jest nieoptymalny, ponieważ nie możesz go złamać, AFAIKArray.prototype.map
.es6
es5
źródło
Po prostu użyj
Array.from()
metody, aby przekonwertować go naArray
:źródło
<any>
wyślij mapę, aby wykonać iterację za pomocą for-of.Array.from()
Strategia proponowana tu nie działa dla mnie.Korzystanie z funkcji Array.from , Array.prototype.forEach () i strzałkowych :
Powtarzaj po klawiszach :
Iteruj po wartościach :
Powtarzaj wpisy :
źródło
To zadziałało dla mnie. Wersja TypeScript: 2.8.3
źródło
target
wtsconfig
jestes5
to zgłasza błąd, alees6
działa poprawnie. Możesz też po prostu zrobićfor (const [key, value] of myMap)
celowaniees6
Zgodnie z uwagami do wydania TypeScript 2.3 „Nowy
--downlevelIteration
” :Nie jest to domyślnie włączone! Dodaj
"downlevelIteration": true
do swojej flagitsconfig.json
lub przekaż--downlevelIteration
jątsc
, aby uzyskać pełną obsługę iteratora.Z tego miejsca, możesz pisać
for (let keyval of myMap) {...}
ikeyval
„s typ zostanie automatycznie wnioskować.Dlaczego jest to domyślnie wyłączone? Według autora TypeScript @aluanhaddad ,
Jeśli możesz kierować reklamy na ES2015 (
"target": "es2015"
w wersjitsconfig.json
lubtsc --target ES2015
) lub później, włączeniedownlevelIteration
jest oczywiste, ale jeśli celujesz w ES5 / ES3, możesz wykonać test porównawczy, aby upewnić się, że obsługa iteratorów nie wpływa na wydajność (jeśli tak, możesz być lepszy wyłączyć zArray.from
konwersją lub wforEach
inny sposób).źródło
To zadziałało dla mnie.
źródło
Używam najnowszego TS i węzła (odpowiednio v2.6 i v8.9) i mogę:
źródło
"downlevelIteration": true
w swoimtsconfig.json
?downlevelIteraton
wyznaczonego, mój cel jestes2017
jednak.Type 'Map<K, V>' is not an array type or a string type.
Możesz również zastosować metodę mapowania tablic do iterowalnej metody Map.entries ():
Ponadto, jak zauważono w innych odpowiedziach, może być konieczne włączenie iteracji niższego poziomu w tsconfig.json (w opcjach kompilatora):
źródło
const projected = Array.from(myMap).map(...);
Wystarczy proste wyjaśnienie, jak używać go w dokumencie HTML.
Jeśli masz Mapę typów (klucz, tablica), to inicjalizujesz tablicę w ten sposób:
Aby wykonać iterację, tworzysz tablicę z wartości kluczowych.
Po prostu użyj go jako tablicy, jak w:
Następnie w HTML możesz użyć:
Wewnątrz tej pętli otrzymujesz wartość tablicy za pomocą:
Gotowe!
źródło
W przypadku Typescript 3.5 i Angular 8 LTS wymagane było rzutowanie typu w następujący sposób:
źródło
Jeśli naprawdę nie lubisz funkcji zagnieżdżonych, możesz także iterować po klawiszach:
Uwaga, musisz odfiltrować iteracje niebędące kluczami za pomocą
hasOwnProperty
, jeśli tego nie zrobisz, otrzymasz ostrzeżenie lub błąd.źródło