मैं टाइपस्क्रिप्ट में एक क्लास बना रहा हूं, जिसमें एक संपत्ति है जो ES6 (ECMAscript 2016) मैप की तरह है:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
मैं टाइपस्क्रिप्ट में ES6 मैप प्रकार की घोषणा कैसे करूं?
मैं टाइपस्क्रिप्ट में एक क्लास बना रहा हूं, जिसमें एक संपत्ति है जो ES6 (ECMAscript 2016) मैप की तरह है:
class Item {
configs: ????;
constructor () {
this.configs = new Map();
}
}
मैं टाइपस्क्रिप्ट में ES6 मैप प्रकार की घोषणा कैसे करूं?
जवाबों:
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; } = {};
कुछ चेतावनी, हालांकि:
stringया हो सकती हैंnumberउपरोक्त उदाहरण के साथ:
// 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
map Map<string,string>=new Map<string,string>()तो भी map.set(something)मैं map is undefinedइसे शुरू करने का एक और तरीका है?
टिप्पणी देखें: 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;
TS2304, कृपया इसे देखें: stackoverflow.com/questions/39416691/…
हां मैप अब टाइपस्क्रिप्ट में उपलब्ध है। यदि आप 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")
मैं टाइपस्क्रिप्ट में ES6 मैप प्रकार की घोषणा कैसे करूं?
आपको निशाना लगाने की जरूरत है --module es6। यह दुर्भाग्यपूर्ण है और आप यहां अपनी चिंता बढ़ा सकते हैं: https://github.com/Microsoft/TypeScript/issues/2953#issuecomment-98514111
नंगे न्यूनतम के रूप में:
tsconfig:
"lib": [
"es2015"
]
और यदि आप IE <11 समर्थन चाहते हैं तो https://github.com/zloirock/core-js जैसे पॉलीफ़िल स्थापित करें : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /नक्शा
यकीन नहीं है कि अगर यह आधिकारिक है, लेकिन यह मेरे लिए टाइपस्क्रिप्ट 2.7.1 में काम किया है:
class Item {
configs: Map<string, string>;
constructor () {
this.configs = new Map();
}
}
सरल में Map<keyType, valueType>
साथ lib config विकल्प आपके चेरी करने में सक्षम हैं अपने प्रोजेक्ट में मानचित्र लेने। बस es2015.collectionअपने परिवाद अनुभाग में जोड़ें । आप के साथ कोई lib config ऐड एक है जब चूक और ऐड es2015.collection।
इसलिए जब आपके पास लक्ष्य हो: es5, तो tsconfig.json बदलें:
"target": "es5",
"lib": [ "dom", "es5", "scripthost", "es2015.collection" ],
टाइपस्क्रिप्ट अभी तक समर्थन नहीं करता है Map।