टाइपस्क्रिप्ट ऑब्जेक्ट्स शब्दकोश प्रकार के रूप में सी # में


336

मेरे पास कुछ जावास्क्रिप्ट कोड हैं जो वस्तुओं को शब्दकोशों के रूप में उपयोग करते हैं; उदाहरण के लिए एक 'व्यक्ति' ऑब्जेक्ट ईमेल पते पर बंद कुछ व्यक्तिगत विवरण रखेगा।

var people = {<email> : <'some personal data'>};

adding   > "people[<email>] = <data>;" 
getting  > "var data = people[<email>];" 
deleting > "delete people[<email>];"

क्या टाइपस्क्रिप्ट में इसका वर्णन करना संभव है? या मुझे एक ऐरे का उपयोग करना है?


5
पुरानी पोस्ट लेकिन ध्यान दें कि ES6 मैप है
ओल्ड बैडमैन ग्रे

जवाबों:


547

टाइपस्क्रिप्ट के नए संस्करणों में आप उपयोग कर सकते हैं:

type Customers = Record<string, Customer>

पुराने संस्करणों में आप उपयोग कर सकते हैं:

var map: { [email: string]: Customer; } = { };
map['foo@gmail.com'] = new Customer(); // OK
map[14] = new Customer(); // Not OK, 14 is not a string
map['bar@hotmail.com'] = 'x'; // Not OK, 'x' is not a customer

आप एक इंटरफ़ेस बना सकते हैं यदि आप हर बार उस संपूर्ण प्रकार का एनोटेशन नहीं लिखना चाहते हैं:

interface StringToCustomerMap {
    [email: string]: Customer;
}

var map: StringToCustomerMap = { };
// Equivalent to first line of above

2
यह सुनिश्चित करने के लिए एक उपयोगी तरीका है कि कंपाइलर अनुक्रमणिका को स्ट्रिंग्स तक सीमित करता है। दिलचस्प। ऐसा नहीं लगता है कि आप अनुक्रमणिका प्रकार को स्ट्रिंग्स या पूर्णांकों के अलावा कुछ भी निर्दिष्ट कर सकते हैं, लेकिन यह समझ में आता है, क्योंकि यह मूल जेएस ऑब्जेक्ट इंडेक्स के लिए सिर्फ मैप करता है।
केन स्मिथ

5
आप यह जान सकते हैं, लेकिन इस दृष्टिकोण के साथ कुछ संभावित गोच भी हैं, बड़ा यह है कि सभी सदस्यों के माध्यम से पुनरावृति करने का कोई सुरक्षित और आसान तरीका नहीं है। उदाहरण के लिए, यह कोड दिखाता है कि mapदो सदस्य हैं: (<any> Object.prototype) .something = function () {}; वर्ग ग्राहक {} var नक्शा: {[email: string]: ग्राहक; } = {}; नक्शा ['foo@gmail.com '] = नया ग्राहक (); for (var i in map) {कंसोल.लॉग (मानचित्र [i])}
केन स्मिथ

5
आप इसे कैसे हटाते हैं?
टोडैवर

24
एक और दिलचस्प दृष्टिकोण है: इंटरफ़ेस MapStringTo <T> {[कुंजी: स्ट्रिंग]: टी; } और वैरिएबल जैसेvar map:MapStringTo<Customer> = {};
orellabac

1
ध्यान दें कि सूचकांक बाधा अब काम नहीं करती है। अधिक पढ़ें।
डेविड शेरेट

127

मानचित्र का उपयोग करने के अलावा- वस्तु की तरह , पिछले कुछ समय से एक वास्तविक Mapवस्तु है , जो ES6 के संकलन के समय टाइपस्क्रिप्ट में उपलब्ध है, या जब ES6 प्रकार की परिभाषाओं के साथ एक पॉलीफ़िल का उपयोग कर रहा है :

let people = new Map<string, Person>();

यह समान कार्यक्षमता का समर्थन करता है Object, और अधिक, थोड़ा अलग वाक्यविन्यास के साथ:

// Adding an item (a key-value pair):
people.set("John", { firstName: "John", lastName: "Doe" });

// Checking for the presence of a key:
people.has("John"); // true

// Retrieving a value by a key:
people.get("John").lastName; // "Doe"

// Deleting an item by a key:
people.delete("John");

अकेले ही मानचित्र का उपयोग करने के कई फायदे हैं - जैसे वस्तु, जैसे:

  • गैर-स्ट्रिंग आधारित कुंजियों के लिए समर्थन, उदाहरण के लिए नंबर या ऑब्जेक्ट, जिनमें से Objectकोई भी समर्थित नहीं है (नहीं, Objectसंख्याओं का समर्थन नहीं करता है, यह उन्हें स्ट्रिंग्स में परिवर्तित करता है)
  • उपयोग न करने पर त्रुटियों के लिए कम कमरा --noImplicitAny, Mapहमेशा की तरह एक कुंजी प्रकार और एक मूल्य प्रकार होता है, जबकि किसी ऑब्जेक्ट में इंडेक्स हस्ताक्षर नहीं हो सकता है
  • आइटम को जोड़ने / निकालने की कार्यक्षमता (की-वैल्यू पेयर) को कार्य के लिए ऑप्टिमाइज़ किया जाता है, ए पर गुण बनाने के विपरीतObject

इसके अतिरिक्त, एक Mapवस्तु आम कार्यों के लिए अधिक शक्तिशाली और सुरुचिपूर्ण एपीआई प्रदान करती है, जिनमें से अधिकांश सरल Objectएस के माध्यम से एक साथ हेल्पर कार्यों को हैक किए बिना उपलब्ध नहीं होती हैं (हालांकि इनमें से कुछ को ES5 लक्ष्यों या नीचे के लिए एक पूर्ण ES6 पुनरावृत्ति / चलने योग्य पॉलीफ़िल की आवश्यकता होती है:

// Iterate over Map entries:
people.forEach((person, key) => ...);

// Clear the Map:
people.clear();

// Get Map size:
people.size;

// Extract keys into array (in insertion order):
let keys = Array.from(people.keys());

// Extract values into array (in insertion order):
let values = Array.from(people.values());

2
वह तो कमाल है! लेकिन दुख की बात है कि इसका गलत उपयोग करके सीरियल बनाया गया है JSON.stringify(), इसलिए इसे सॉकेट के लिए उपयोग किया जा सकता है ।io :(
सिंह

@ लायन - हां, Mapसीरियलाइजेशन बल्कि मजाकिया है। मैं, एक के लिए, क्रमबद्ध करने से पहले कुंजी-मूल्य-जोड़ी वस्तुओं में रूपांतरण करता हूं, और फिर वापस (जैसे ऑब्जेक्ट { key: "John", value: { firstName: "John" } })।
जॉन वीज़

2
मैंने एक सादे पुरानी वस्तु के बजाय एक मानचित्र का उपयोग करने की गलती की, और क्रमांकन मुझे वास्तव में मिला। मेरी राय में स्पष्ट।
user378380

1
ये सुन्दर है। इसलिए खुशी है कि आपने मुझे अंततः नक्शे में डुबकी लगाने के लिए प्रेरित किया। यह मेरे सामान्य कीमैप / शब्दकोश संरचनाओं को बहुत बदल देगा क्योंकि यह कुंजी को दृढ़ता से टाइप करना बहुत आसान है।
मेथोडिस्ट

77

आप इस तरह टेम्पर्ड इंटरफेस का उपयोग कर सकते हैं:

interface Map<T> {
    [K: string]: T;
}

let dict: Map<number> = {};
dict["one"] = 1;

7
ध्यान दें कि यह es6 मानचित्र प्रकार से टकराता है। अन्य उत्तर से बेहतर है क्योंकि इंडेक्स की कमी को नजरअंदाज किया जाता है।
पुराना बैडमैन ग्रे

यदि कोई कुंजी शब्दकोश में मौजूद है, तो मैं कैसे जांचूं?
शाम

dict.hasOwnProperty ('की')
Dimitar Mazhlekov

1
भ्रम की स्थिति से बचने के लिए मैं मैप के बजाय डिक्शनरी का उपयोग करता हूं और आप शाब्दिक वस्तु संकेतन का उपयोग कर सकते हैं:let dict: Dictionary<number> = { "one": 1, "two": 2 };
PhiLho

8

आप टाइपस्क्रिप्ट में रिकॉर्ड प्रकार का भी उपयोग कर सकते हैं:

export interface nameInterface { 
    propName : Record<string, otherComplexInterface> 
}

5

लोदाश का एक सरल शब्दकोश कार्यान्वयन है और इसमें टाइप टाइपस्क्रिप्ट का अच्छा समर्थन है

लोडश स्थापित करें:

npm install lodash @types/lodash --save

आयात और उपयोग:

import { Dictionary } from "lodash";
let properties : Dictionary<string> = {
    "key": "value"        
}
console.log(properties["key"])

3

आप इसके लिए उपयोग कर सकते हैं Record:

https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt

उदाहरण (अपॉइंटमेंटस्टैटस एनम और कुछ मेटा डेटा के बीच एक मैपिंग):

  const iconMapping: Record<AppointmentStatus, Icon> = {
    [AppointmentStatus.Failed]: { Name: 'calendar times', Color: 'red' },
    [AppointmentStatus.Canceled]: { Name: 'calendar times outline', Color: 'red' },
    [AppointmentStatus.Confirmed]: { Name: 'calendar check outline', Color: 'green' },
    [AppointmentStatus.Requested]: { Name: 'calendar alternate outline', Color: 'orange' },
    [AppointmentStatus.None]: { Name: 'calendar outline', Color: 'blue' }
  }

अब मूल्य के रूप में इंटरफेस के साथ:

interface Icon { Name: string Color: string }

उपयोग:

const icon: SemanticIcon = iconMapping[appointment.Status]


यह बहुत उपयोगी है। क्या आप एक स्ट्रिंग enumया एक के class/objectलिए उपयोग करेंगे AppointmentStatus- या इससे कोई फर्क नहीं पड़ता?
द्रेनाई

@ डैरेन कोई फर्क नहीं पड़ता, यह वह है जिसे आप पसंद करते हैं
निक एन।

-2

एक पुस्तकालय है जो टाइपस्क्रिप्ट में दृढ़ता से टाइप, क्वेरी संग्रह प्रदान करता है ।

संग्रह हैं:

  • सूची
  • शब्दकोश

पुस्तकालय को ts-जेनेरिक-संग्रह कहा जाता है । ( GitHub पर स्रोत कोड )

आप एक शब्दकोश बना सकते हैं और इसे नीचे की तरह क्वेरी कर सकते हैं:

  it('firstOrDefault', () => {
    let dictionary = new Dictionary<Car, IList<Feature>>();

    let car = new Car(1, "Mercedez", "S 400", Country.Germany);
    let car2 = new Car(2, "Mercedez", "S 500", Country.Germany);

    let features = new List<Feature>();

    let feature = new Feature(1, "2 - Door Sedan");
    features.add(feature);

    dictionary.add(car, features);

    features = new List<Feature>();
    feature = new Feature(2, "4 - Door Sedan");
    features.add(feature);

    dictionary.add(car2, features);

    //query
    let first = dictionary.firstOrDefault(x => x.key.name == "Mercedez");

    expect(first.key.id = 1);
  });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.