टाइपस्क्रिप्ट में ES6 मैप


173

मैं टाइपस्क्रिप्ट में एक क्लास बना रहा हूं, जिसमें एक संपत्ति है जो ES6 (ECMAscript 2016) मैप की तरह है:

class Item {
  configs: ????;
  constructor () {
    this.configs = new Map();
  }
}

मैं टाइपस्क्रिप्ट में ES6 मैप प्रकार की घोषणा कैसे करूं?

जवाबों:


233

EDIT (Jun 5 2019): जबकि यह विचार कि "टाइपस्क्रिप्ट Mapमूल रूप से समर्थन करता है" अभी भी सही है, क्योंकि संस्करण 2.1 टाइपस्क्रिप्ट कुछ कहे जाने का समर्थन करता है Record

type MyMapLikeType = Record<string, IPerson>;
const peopleA: MyMapLikeType = {
    "a": { name: "joe" },
    "b": { name: "bart" },
};

दुर्भाग्य से पहला जेनेरिक पैरामीटर (कुंजी प्रकार) अभी भी पूरी तरह से सम्मानित नहीं है: यहां तक ​​कि एक stringप्रकार के साथ , कुछ peopleA[0]( जैसे number) अभी भी मान्य है।


EDIT (अप्रैल 25 2016): नीचे दिया गया उत्तर पुराना है और इसे सर्वश्रेष्ठ उत्तर नहीं माना जाना चाहिए। टाइपस्क्रिप्ट अब "मूल रूप से" मैप्स का समर्थन करता है, इसलिए यह केवल ES6 मैप्स का उपयोग करने की अनुमति देता है जब आउटपुट ES6 होता है। ईएस 5 के लिए, यह पॉलीफिल प्रदान नहीं करता है; आपको उन्हें स्वयं एम्बेड करने की आवश्यकता है।

अधिक जानकारी के लिए, अधिक आधुनिक उत्तर के लिए नीचे दिए गए मोहम्मद हेगाज़ी के उत्तर का संदर्भ लें , या यहां तक ​​कि एक छोटे संस्करण के लिए यह रेडिट टिप्पणी भी ।


1.5.0 बीटा के अनुसार, टाइपस्क्रिप्ट अभी तक मैप्स का समर्थन नहीं करता है । यह अभी तक रोडमैप का हिस्सा नहीं है ।

वर्तमान सबसे अच्छा समाधान टाइप किए गए कुंजी और मूल्य के साथ एक वस्तु है (कभी-कभी एक हैशमैप कहा जाता है)। प्रकार की कुंजियों के साथ एक वस्तु के लिए string, और प्रकार के मूल्य number:

var arr : { [key:string]:number; } = {};

कुछ चेतावनी, हालांकि:

  1. कुंजियाँ केवल प्रकार की stringया हो सकती हैंnumber
  2. यह वास्तव में महत्वपूर्ण नहीं है कि आप मुख्य प्रकार के रूप में क्या उपयोग करते हैं, क्योंकि संख्या / तार अभी भी विनिमेय रूप से स्वीकार किए जाते हैं (केवल मूल्य लागू किया जाता है)।

उपरोक्त उदाहरण के साथ:

// OK:
arr["name"] = 1; // String key is fine
arr[0] = 0; // Number key is fine too

// Not OK:
arr[{ a: "a" }] = 2; // Invalid key
arr[3] = "name"; // Invalid value

3
फिर आप नक्शे में गुणों को कैसे दर्ज करते हैं? जब मैं गिरफ्तारी करता हूं। (), मुझे "संपत्ति 'मान' प्रकार पर मौजूद नहीं है ..."
वर्न जेन्सेन

जैसा है वैसा नहीं values(), मैं करूँगा for (var key in arr) ... arr[key]या for...of। अन्य समाधान (जो आजकल अधिक से अधिक यथार्थवादी है और बहुत कुछ के लिए थोड़ी देर के लिए होगा) कोरज का उपयोग करना है
zeh

वास्तव में जब मैं इस तरह से घोषित किए गए नक्शे पर एक संपत्ति के रूप में किसी भी कुंजी का उपयोग करता हूं तो मुझे "संपत्ति 'मिलती है जो कुछ भी प्रकार पर मौजूद नहीं है"
rakslice

मैं एक का निर्माण करने के लिए मैप क्लास का उपयोग कर रहा हूं, लेकिन अगर मुझे अपवाद मिलता है map Map<string,string>=new Map<string,string>()तो भी map.set(something)मैं map is undefinedइसे शुरू करने का एक और तरीका है?
mautrok


128

टिप्पणी देखें: https://github.com/Microsoft/TypeScript/issues/3069#issuecomment-99964649

टाइपस्क्रिप्ट पॉलीफ़िल में निर्मित के साथ नहीं आती है। यह आपको तय करना है कि किस पॉलीफिल का उपयोग करना है, यदि कोई हो। आप es6Collection , es6-shims , corejs ..etc जैसी किसी चीज का उपयोग कर सकते हैं । सभी टाइपस्क्रिप्ट कंपाइलर की जरूरत ES6 निर्माणों के लिए एक घोषणा है जिसका आप उपयोग करना चाहते हैं। आप उन सभी को इस lib फ़ाइल में पा सकते हैं ।

यहाँ प्रासंगिक हिस्सा है:

interface Map<K, V> {
    clear(): void;
    delete(key: K): boolean;
    entries(): IterableIterator<[K, V]>;
    forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void;
    get(key: K): V;
    has(key: K): boolean;
    keys(): IterableIterator<K>;
    set(key: K, value?: V): Map<K, V>;
    size: number;
    values(): IterableIterator<V>;
    [Symbol.iterator]():IterableIterator<[K,V]>;
    [Symbol.toStringTag]: string;
}

interface MapConstructor {
    new <K, V>(): Map<K, V>;
    new <K, V>(iterable: Iterable<[K, V]>): Map<K, V>;
    prototype: Map<any, any>;
}
declare var Map: MapConstructor;



30

हां मैप अब टाइपस्क्रिप्ट में उपलब्ध है। यदि आप lib.es6.d.ts में देखते हैं, तो आप इंटरफ़ेस देखेंगे:

interface Map<K, V> {
  clear(): void;
  delete(key: K): boolean;
  forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void,thisArg?: any): void;
  get(key: K): V | undefined;
  has(key: K): boolean;
  set(key: K, value: V): this;
  readonly size: number;} 

स्ट्रिंग, ऑब्जेक्ट जोड़े के शब्दकोश के रूप में उपयोग करने के लिए बहुत अच्छा है। एकमात्र झुंझलाहट यह है कि यदि आप इसका उपयोग Map.get (कुंजी) के साथ कहीं और मान प्रदान करने के लिए कर रहे हैं , तो कोड की तरह IDE आपको संभावित अपरिभाषित होने के बारे में समस्याएं देता है .. बल्कि एक परिभाषित-परिभाषित चेक के साथ एक वैरिएबल बनाना .. बस टाइप करें (यह मानकर कि आपको पता है कि नक्शे में कुंजी-मूल्य जोड़ी है)

class myclass {
   mymap:Map<string,object>
   ...
   mymap = new Map<string,object>()
   mymap.set("akey",AnObject)
   let objectref = <AnObject>mymap.get("akey")

12

मैं टाइपस्क्रिप्ट में ES6 मैप प्रकार की घोषणा कैसे करूं?

आपको निशाना लगाने की जरूरत है --module es6। यह दुर्भाग्यपूर्ण है और आप यहां अपनी चिंता बढ़ा सकते हैं: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111



4

यकीन नहीं है कि अगर यह आधिकारिक है, लेकिन यह मेरे लिए टाइपस्क्रिप्ट 2.7.1 में काम किया है:

class Item {
   configs: Map<string, string>;
   constructor () {
     this.configs = new Map();
   }
}

सरल में Map<keyType, valueType>


3

साथ lib config विकल्प आपके चेरी करने में सक्षम हैं अपने प्रोजेक्ट में मानचित्र लेने। बस es2015.collectionअपने परिवाद अनुभाग में जोड़ें । आप के साथ कोई lib config ऐड एक है जब चूक और ऐड es2015.collection

इसलिए जब आपके पास लक्ष्य हो: es5, तो tsconfig.json बदलें:

"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],

1

टाइपस्क्रिप्ट अभी तक समर्थन नहीं करता है Map

ES6 संगतता तालिका


4
टाइपस्क्रिप्ट के विकी पर यह पृष्ठ ऐसा लगता है कि यह समर्थित है: टाइपस्क्रिप्ट.कोडप्लेक्स.
com/ /

2019 जून - मानचित्र का समर्थन किया गया है
योहानतन येहज़केल

0

फ़ाइल में "target": "ESNEXT"संपत्ति जोड़ें tsconfig.json

{
    "compilerOptions": {
        "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.