Я пытаюсь перебрать карту машинописного текста, но продолжаю получать ошибки и пока не могу найти решения для такой тривиальной проблемы.
Мой код:
myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
console.log(key);
}
И я получаю ошибку:
Тип «IterableIteratorShim <[string, boolean]>» не является типом массива или строковым типом.
Полная трассировка стека:
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)
Я использую angular-cli beta5 и typescript 1.8.10, и моя цель - es5. У кого-нибудь была эта проблема?
typescript
iterator
maps
м.в.э.
источник
источник
Ответы:
Map.prototype.forEach((value, key, map) => void, thisArg?) : void
Вместо этого вы можете использоватьИспользуйте это так:
источник
.forEach
неоптимально, так как вы не можете его сломать,Array.prototype.map
.ES6
ES5
источник
Просто используйте
Array.from()
метод, чтобы преобразовать его вArray
:источник
<any>
приведите карту, чтобы повторить ее с помощью for-of.Array.from()
Стратегия , предложенная здесь сделали работу для меня.Использование функций Array.from , Array.prototype.forEach () и стрелок :
Перебрать ключи :
Перебрать значения :
Перебрать записи :
источник
Это сработало для меня. Версия TypeScript: 2.8.3
источник
target
intsconfig
is,es5
это выдает ошибку, но сes6
работает правильно. Вы также можете просто сделатьfor (const [key, value] of myMap)
при нацеливанииes6
Согласно примечаниям к выпуску TypeScript 2.3 на «Новом
--downlevelIteration
» :По умолчанию это не включено! Добавьте
"downlevelIteration": true
в свойtsconfig.json
или передайте--downlevelIteration
флагtsc
, чтобы получить полную поддержку итератора.Имея это место, вы можете написать,
for (let keyval of myMap) {...}
иkeyval
тип будет автоматически выведен.Почему по умолчанию отключено? По словам автора TypeScript @aluanhaddad ,
Если вы можете настроить таргетинг на ES2015 (
"target": "es2015"
вtsconfig.json
илиtsc --target ES2015
) или более позднюю версию , включениеdownlevelIteration
не составит труда, но если вы ориентируетесь на ES5 / ES3, вы можете провести тест, чтобы убедиться, что поддержка итератора не влияет на производительность (если это так, вам может быть лучше выключить сArray.from
преобразованием илиforEach
другим способом).источник
Это сработало для меня.
источник
Я использую последние версии TS и node (v2.6 и v8.9 соответственно), и я могу:
источник
"downlevelIteration": true
свойtsconfig.json
?downlevelIteraton
ставил, но моя цель естьes2017
.Type 'Map<K, V>' is not an array type or a string type.
Вы также можете применить метод карты массива к итерации Map.entries ():
Кроме того, как отмечено в других ответах, вам может потребоваться включить итерацию нижнего уровня в вашем tsconfig.json (в параметрах компилятора):
источник
const projected = Array.from(myMap).map(...);
Просто простое объяснение использования его в документе HTML.
Если у вас есть карта типов (ключ, массив), вы инициализируете массив следующим образом:
И чтобы перебирать его, вы создаете массив из значений ключей.
Просто используйте его как массив, как в:
Затем в HTML вы можете использовать:
Внутри этого цикла вы просто получаете значение массива с помощью:
Готово!
источник
В Typescript 3.5 и Angular 8 LTS требовалось привести тип следующим образом:
источник
Если вам не очень нравятся вложенные функции, вы также можете перебирать ключи:
Обратите внимание, что вы должны отфильтровать неключевые итерации с помощью
hasOwnProperty
, если вы этого не сделаете, вы получите предупреждение или ошибку.источник