Saya mencoba untuk mengulangi peta ketikan tetapi saya terus mendapatkan kesalahan dan saya belum bisa menemukan solusi untuk masalah sepele seperti itu.
Kode saya adalah:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
Dan saya mendapatkan Error:
Jenis 'IterableIteratorShim <[string, boolean]>' bukan jenis larik atau jenis string.
Jejak Tumpukan Penuh:
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)
Saya menggunakan angular-cli beta5 dan typescript 1.8.10 dan target saya adalah es5. Adakah yang punya masalah ini?
typescript
iterator
maps
mwe
sumber
sumber
Jawaban:
Anda bisa menggunakan
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
sebagai gantinyaGunakan seperti ini:
sumber
.forEach
kurang optimal, karena Anda tidak dapat memecahkannya, AFAIKArray.prototype.map
.es6
es5
sumber
Cukup gunakan
Array.from()
metode untuk mengubahnya menjadi fileArray
:sumber
<any>
siarkan peta untuk mengulanginya dengan for-of.Array.from()
strategi yang diusulkan di sini melakukan pekerjaan untuk saya.Menggunakan fungsi Array.from , Array.prototype.forEach () , dan panah :
Iterasi di atas kunci :
Iterasi nilai :
Iterasi entri :
sumber
Ini berhasil untuk saya. Versi TypeScript: 2.8.3
sumber
target
ditsconfig
adalahes5
ini melempar kesalahan, tapi denganes6
karya-karya dengan benar. Anda juga dapat melakukannyafor (const [key, value] of myMap)
saat menargetkanes6
Sesuai catatan rilis TypeScript 2.3 tentang "Baru
--downlevelIteration
" :Ini tidak diaktifkan secara default! Tambahkan
"downlevelIteration": true
ke Andatsconfig.json
, atau berikan--downlevelIteration
bendera ketsc
, untuk mendapatkan dukungan iterator penuh.Dengan ini, Anda dapat menulis
for (let keyval of myMap) {...}
dankeyval
tipe akan disimpulkan secara otomatis.Mengapa ini dimatikan secara default? Menurut kontributor TypeScript @aluanhaddad ,
Jika Anda dapat menargetkan ES2015 (
"target": "es2015"
dalamtsconfig.json
atautsc --target ES2015
) atau lebih baru, mengaktifkannyadownlevelIteration
tidak perlu dipikirkan lagi, tetapi jika Anda menargetkan ES5 / ES3, Anda dapat melakukan tolok ukur untuk memastikan dukungan iterator tidak memengaruhi kinerja (jika ya, Anda mungkin lebih baik off denganArray.from
konversi atauforEach
atau solusi lain).sumber
Ini berhasil untuk saya.
sumber
Saya menggunakan TS dan node terbaru (masing-masing v2.6 dan v8.9) dan saya dapat melakukan:
sumber
"downlevelIteration": true
di Andatsconfig.json
?downlevelIteraton
menetapkan,es2017
namun target saya .Type 'Map<K, V>' is not an array type or a string type.
Anda juga bisa menerapkan metode peta larik ke iterable Map.entries ():
Juga, seperti disebutkan dalam jawaban lain, Anda mungkin harus mengaktifkan iterasi tingkat bawah di tsconfig.json Anda (di bawah opsi kompiler):
sumber
const projected = Array.from(myMap).map(...);
Hanya penjelasan sederhana untuk menggunakannya dalam dokumen HTML.
Jika Anda memiliki Map of types (key, array) maka Anda menginisialisasi array dengan cara ini:
Dan untuk mengulanginya, Anda membuat array dari nilai kunci.
Gunakan saja sebagai array seperti pada:
Kemudian, dalam HTML, Anda dapat menggunakan:
Di dalam loop ini, Anda baru saja mendapatkan nilai array dengan:
Selesai!
sumber
Pada Typecript 3.5 dan Angular 8 LTS, diharuskan untuk menggunakan tipe sebagai berikut:
sumber
Jika Anda tidak terlalu menyukai fungsi bersarang, Anda juga dapat melakukan iterasi pada tombol:
Catatan, Anda harus memfilter iterasi non-kunci dengan
hasOwnProperty
, jika Anda tidak melakukan ini, Anda akan mendapatkan peringatan atau kesalahan.sumber