2013-03-17 5 views
10

मैं टाइपस्क्रिप्ट के साथ खेल रहा हूं और जावास्क्रिप्ट से इसे एक छोटी लाइब्रेरी में परिवर्तित कर रहा हूं। कोड के एक क्षेत्र में उनके कुंजीकोड में दोस्ताना कुंजी नाम का एक सांख्यिकीय रूप से परिभाषित मैपिंग था। मूल कोड देखा की तरह:मैं टाइपस्क्रिप्ट में एक संख्या-> स्ट्रिंग डिक्शनरी को कैसे परिभाषित करूं?

keys: { "Backspace": 8, "Tab": 9, "Enter": 13, ....etc.. }; 

मैं के माध्यम से टाइपप्रति में इस परिभाषित:

chars: {8:"Backspace",9:"Tab",13:"Enter", ...etc... }; 
:

static keys: { [name: string]: number; } = { "Backspace": 8, "Tab": 9, "Enter": 13, ... etc.. }; 

यह ठीक से काम करने लगता है, हालांकि कोड के किसी अन्य भाग विपरीत मानचित्रण का उपयोग करता है

इसलिए मैंने टाइपस्क्रिप्ट में उसी प्रकार की परिभाषा करने की कोशिश की जो मैंने पहले किया था:

chars: { [code: number]: string; } = { 8: "Backspace", 9: "Tab", 13: "Enter", ...etc.. }; 

यह निम्न त्रुटि के साथ संकलित करने के लिए विफल रहता है:

Cannot convert '{ 0: string; 1: string; 2: string; 4: string; 8: string; 9: string; : string; }' to '{ [name: number]: string; }': Index signatures of types '{ 0: string; 1: string; 2: string; 4: string; 8: string; 9: string; : string; }' and '{ [name: number]: string; }' are incompatible

मैं टाइपप्रति में इस मानचित्रण कैसे परिभाषित करते हैं?

उत्तर

8

समस्या यह है कि जावास्क्रिप्ट में - और इसलिए टाइपस्क्रिप्ट में - ऑब्जेक्ट शाब्दिक की चाबियाँ हमेशा स्ट्रिंग होती हैं, और इसलिए इसे एक सूचकांक के साथ एक चर के लिए असाइन नहीं किया जा सकता है।

एक नंबर इंडेक्सर के साथ एक वस्तु एक सरणी है - और इसलिए आप यह करने के लिए है:

var chars: string[] = []; 
chars[8]= "Backspace"; 
chars[9]= "Tab"; 
chars[13] = "Enter"; 
1

दरअसल आंतरिक रूप से केवल स्ट्रिंग आधारित है सूचकांकों लेकिन स्ट्रिंग/संख्या (सरणी {} से अलग होने के साथ) जे एस रूपांतरण js में स्थिर है:

var x = {0 : "asdf",1:"bb"} 
alert(x[0]) 
alert(x[1]) 

मुझे लगता है कि टाइपप्रति रूप में अच्छी तरह यह समर्थन करना चाहिए और एक काम मद आप पर मतदान कर सकते बनाया: http://typescript.codeplex.com/workitem/832

2

Here's a library called Classical.js * जो आपको और इसी तरह की समस्याओं को पूरा करने में मदद कर सकता है। यह अन्य चीजों के साथ, एक दोगुना जेनेरिक शब्दकोश परिभाषित करता है। वस्तुओं के सभी प्रकार के साथ

import c = Classical.Collections; 

var keys = new c.Dictionary<string, number>(); 
keys.add("Backspace", 8); 
keys.add("Tab", 9); 
keys.add("Enter", 13); 
//etc... 

keys.getValue("Backspace"); //8 
keys.getValue("Tab"); //9 
keys.getValue("Enter"); //13 
//etc... 

शब्दकोश < TKey, TValue > काम करता है और इस तरह के 'निर्माता' नाम कुंजी के रूप में नाम टकराव के साथ मुद्दों नहीं है: आपके उपयोग के मामले के लिए, कोड इस प्रकार दिखाई देगा।

विपरीत मानचित्रण आप या तो उलटा शब्दकोश का निर्माण या मौजूदा एक तो जैसे क्वेरी सकता है के लिए:

keys.query().single(pair => pair.key === 8).value; //"Backspace" 
keys.query().single(pair => pair.key === 9).value; //"Tab" 
keys.query().single(pair => pair.key === 13).value; //"Enter" 
//etc... 

आप इसे एक कोशिश देने के लिए, पर जाएँ Classical, बिन फ़ोल्डर को खोलने चाहते हैं और अपनी परियोजना में classical.js और classical.d.ts जोड़ें।

उम्मीद है कि मदद करता है।


* मैं शास्त्रीय टीम पर डेवलपर्स में से एक हूँ

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