2016-06-08 16 views
27

मैं एक टाइपस्क्रिप्ट मानचित्र पर फिर से प्रयास करने की कोशिश कर रहा हूं लेकिन मुझे त्रुटियां मिल रही हैं और मुझे इस तरह की छोटी समस्या के लिए अभी तक कोई समाधान नहीं मिला।टाइपस्क्रिप्ट मानचित्र पर छेड़छाड़

मेरे कोड है:

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

और मैं त्रुटि मिलती है:

Type 'IterableIteratorShim<[string, boolean]>' is not an array type or a string type.

पूर्ण स्टैक ट्रेस: ​​

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)

मैं कोणीय CLI beta5 और टाइपप्रति 1.8 उपयोग कर रहा हूँ .10 और मेरा लक्ष्य es5 है। क्या किसी को यह समस्या है?

+4

इस उत्तर को github https://github.com/Microsoft/TypeScript/issues/3164#issuecomment-104443321 – yurzui

+0

धन्यवाद से देखें। यह भी थोड़ा अजीब है कि वे अभी भी इस मुद्दे के बारे में चर्चा कर रहे हैं। – mwe

उत्तर

46

आप Map.prototype.forEach((value, key, map) => void, thisArg?) : void इस्तेमाल कर सकते हैं बजाय

इस तरह यह प्रयोग करें:

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

बस इसमें भाग गया। ऐसा लगता है कि टाइपस्क्रिप्ट मैप पुनरावृत्ति के लिए spec का सम्मान कर रहा है, कम से कम [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) के अनुसार जो निर्दिष्ट करता है लूप के लिए एक। 'forEach' उप-इष्टतम है, क्योंकि आप इसे तोड़ नहीं सकते हैं, AFAIK – Samjones

+3

मेरे अनुभव दिखाते हैं .forEach बस काम नहीं करता है। यह पूरे पाश को अनदेखा करता है, कुछ भी नहीं होता है। – peterh

+0

इसे कोणीय अभिव्यक्ति में कैसे प्रिंट करें? – Lobato

1

तुम सच में नेस्टेड कार्यों की तरह, आप भी चाबियाँ पर पुनरावृति कर सकते हैं नहीं है, तो:

myMap : Map<string, boolean>; 
for(let key of myMap) { 
    if (myMap.hasOwnProperty(key)) { 
     console.log(JSON.stringify({key: key, value: myMap[key]})); 
    } 
} 

नोट, यदि आप ऐसा नहीं करते हैं, तो आपको hasOwnProperty के साथ गैर-कुंजी पुनरावृत्तियों को फ़िल्टर करना होगा, आपको चेतावनी या त्रुटि मिलती है।

+0

एचटीएमएल में मानचित्र पर फिर से कैसे करें? यह बिल्कुल काम नहीं कर रहा है।

{{key}}.
powerfade917

+0

@ powerfade917 यह काम नहीं करता है, यह केवल सरणी के लिए काम करता है क्योंकि कोणीय कचरे का ढेर है। लेकिन इसे एक नए प्रश्न के रूप में पूछें और इसलिए आप सीखेंगे, कि कोणीय कूड़ेदान का ढेर नहीं है, लेकिन आपको इसे एक सरणी में परिवर्तित करना होगा। नोट, आप प्रोग्रामिंग के शीर्ष पर भी शीर्ष नहीं हैं, क्योंकि आप कोणीय और टाइपस्क्रिप्ट के बीच अंतर करने के लिए प्रतीत होता है। – peterh

12

बस Array.from() विधि का उपयोग यह एक सरणी में बदलने के लिए:

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

यह अन्य प्रकार के लिए कुंजी के रूप में भी काम करता है, न केवल 'स्ट्रिंग' के लिए और कुंजी को 'स्ट्रिंग' में परिवर्तित नहीं किया जाता है। – kcpr

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

मैं नवीनतम टीएस और नोड (v2.6 और v8.9 क्रमशः) का उपयोग कर रहा है और मैं यह कर सकते हैं कार्य करें:

let myMap = new Map<string, boolean>(); 
myMap.set("a", true); 
for (let [k, v] of myMap) { 
    console.log(k + "=" + v); 
} 
+0

क्या आप पुष्टि कर सकते हैं कि आपको पहले 'tsconfig.json' में 'डाउनलवेइटरेशन' सेट करना होगा: सत्य '? –

+1

मेरे पास 'डाउनलवेइटरटन 'सेट नहीं है, मेरा लक्ष्य' es2017' है। – lazieburd

0

प्रति TypeScript 2.3 release notes on "New --downlevelIteration":

for..of statements , Array Destructuring, and Spread elements in Array, Call, and New expressions support Symbol.iterator in ES5/E3 if available when using --downlevelIteration

यह डिफ़ॉल्ट रूप से सक्षम नहीं है!"downlevelIteration": true अपने tsconfig.json पर जोड़ें, या --downlevelIteration ध्वज tsc पर पूर्ण इटरेटर समर्थन प्राप्त करने के लिए पास करें।

इस जगह के साथ, आप for (let keyval of myMap) {...} और keyval लिख सकते हैं स्वचालित रूप से अनुमानित किया जाएगा।


डिफ़ॉल्ट रूप से यह क्यों बंद हो जाता है? टाइपप्रति योगदानकर्ता @aluanhaddad, के अनुसार

It is optional because it has a very significant impact on the size of generated code, and potentially on performance, for all uses of iterables (including arrays).

आप (tsconfig.json या tsc --target ES2015 में "target": "es2015") ES2015 या बाद में लक्षित कर सकते हैं, तो downlevelIteration को सक्षम करने के लिए एक चाहती हैं, लेकिन अगर आप ES5/ES3 लक्षित कर रहे हैं, आप के लिए बेंचमार्क हो सकता है सुनिश्चित करें कि इटरेटर समर्थन प्रदर्शन को प्रभावित नहीं करता है (यदि ऐसा होता है, तो आप Array.from रूपांतरण या forEach या कुछ अन्य कामकाज के साथ बेहतर हो सकते हैं)।

संबंधित मुद्दे