[typescript] Typescript 맵 반복

타이프 스크립트 맵을 반복하려고하는데 계속 오류가 발생하고 사소한 문제에 대한 해결책을 아직 찾을 수 없습니다.

내 코드는 다음과 같습니다.

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입니다. 누구든지이 문제가 있었습니까?



답변

Map.prototype.forEach((value, key, map) => void, thisArg?) : void대신 사용할 수 있습니다.

다음과 같이 사용하십시오.

myMap.forEach((value: boolean, key: string) => {
    console.log(key, value);
});


답변

es6

for (let [key, value] of map) {
    console.log(key, value);
}

es5

for (let entry of Array.from(map.entries())) {
    let key = entry[0];
    let value = entry[1];
}


답변

Array.from()방법을 사용 하여 다음으로 변환하십시오 Array.

myMap : Map<string, boolean>;
for(let key of Array.from( myMap.keys()) ) {
   console.log(key);
}


답변

사용 Array.from , Array.prototype.forEach을 () 하고, 기능을 화살표 :

키를 반복 합니다 .

Array.from(myMap.keys()).forEach(key => console.log(key));

값을 반복 합니다 .

Array.from(myMap.values()).forEach(value => console.log(value));

항목을 반복 합니다 .

Array.from(myMap.entries()).forEach(entry => console.log('Key: ' + entry[0] + ' Value: ' + entry[1]));


답변

이것은 나를 위해 일했습니다. TypeScript 버전 : 2.8.3

for (const [key, value] of Object.entries(myMap)) {
    console.log(key, value);
}


답변

“New --downlevelIteration” 에 대한 TypeScript 2.3 릴리스 노트에 따라 :

for..of statements, Array Destructuring 및 Array, Call 및 New 표현식의 Spread 요소는 사용할 때 ES5 / E3에서 Symbol.iterator를 지원합니다. --downlevelIteration

이것은 기본적으로 활성화되어 있지 않습니다! 에 추가 하거나 플래그를에 전달 하여 전체 반복자 지원 "downlevelIteration": true을 받으십시오 .tsconfig.json--downlevelIterationtsc

이것으로 쓸 수 for (let keyval of myMap) {...}있고 keyval의 유형이 자동으로 유추됩니다.


이 기능이 기본적으로 꺼져있는 이유는 무엇입니까? TypeScript 기고자 @aluanhaddad 에 따르면 ,

이터 러블 (배열 포함)의 모든 사용에 대해 생성 된 코드의 크기와 잠재적으로 성능에 매우 큰 영향을 미치기 때문에 선택 사항입니다.

당신이 ES2015 (타겟팅 할 수있는 경우 "target": "es2015"tsconfig.json또는 tsc --target ES2015) 이상을, 가능하게는 downlevelIteration생각할 필요 없다,하지만 당신은 ES5 / ES3을 대상으로하는 경우, 당신은 반복자 지원이, 실행하는 경우, 당신은 더 나은 수 있습니다 (하지 않는 성능에 영향을 확인하기 위해 벤치 마크를 수도 와 떨어져 Array.from전환 또는 forEach) 또는 다른 해결 방법.


답변

이것은 나를 위해 일했습니다.

Object.keys(myMap).map( key => {
    console.log("key: " + key);
    console.log("value: " + myMap[key]);
});