टाइपस्क्रिप्ट में ऑब्जेक्ट-कुंजी प्रकार के रूप में प्रतीक का उपयोग करना


20

मैं MDN के कहने के बाद से एक ऑब्जेक्ट को कुंजी-प्रकार के प्रतीक के रूप में परिभाषित करने की कोशिश कर रहा हूं :

एक प्रतीक मूल्य का उपयोग वस्तु गुणों के लिए एक पहचानकर्ता के रूप में किया जा सकता है [...]

लेकिन कुंजी-संपत्ति के लिए इसे टाइप के रूप में उपयोग करना:

type obj = {
    [key: symbol | string]: string
}

निम्नलिखित त्रुटि के परिणाम:

TS1023: एक इंडेक्स सिग्नेचर पैरामीटर टाइप 'स्ट्रिंग' या 'नंबर' होना चाहिए।

यहां तक ​​कि इसे सूचकांक-प्रकार के रूप में इस्तेमाल किया जा सकता है। मैं नवीनतम टाइपस्क्रिप्ट संस्करण का उपयोग कर रहा हूं ( v3.7.2), संबंधित प्रश्न जो मैंने पाया है:

मैंने टाइपस्क्रिप्ट प्रतीक डॉक्स पर भी एक नज़र डाली है, लेकिन वे केवल यह दिखाते हैं कि इसका उपयोग मूल्य के रूप में कैसे किया जाता है, न कि प्रकार के रूप में।

उदाहरण:

const obj = {} as {
    [key: number | symbol]: string // Won't work
};

const sym = Symbol('My symbol');
obj[sym] = 'Hi';

Microsoft / टाइपस्क्रिप्ट पर समस्या

सुविधा अनुरोध खोलें


मुझे लगता है कि टाइपस्क्रिप्ट केवल अपने ऑब्जेक्ट प्रकार की घोषणाओं में विशिष्ट प्रतीकों का समर्थन करता है। क्या आप वास्तव में कोई चाहते हैं symbol? हो सकता है कि आप अपना उपयोग कैसे करना चाहते हैं, इसका एक उदाहरण दिखाएं type obj- मुझे संदेह है कि सभी प्रतीक-कुंजी गुण होंगे string
बेर्गी

@Bergi मैंने एक उदाहरण जोड़ा है, हो सकता है कि मैंने किसी चीज़ की देखरेख की हो, लेकिन मुझे ts लाने के लिए एक प्रतीक स्वीकार करने का कोई तरीका नहीं मिल रहा है (बिना उपयोग के anyजो कि बुरा अभ्यास है)।
साइमन


मुझे यकीन नहीं है कि अगर मैं सही हूं, लेकिन क्या आपने Map<Symbol,String>हमारे पास मैप के रूप में उपयोग करने की कोशिश की है , अगर वह उस उद्देश्य को पूरा करेगा जो आप प्राप्त करने की कोशिश कर रहे हैं
पावन कुमार

मेरे लिए एक ही मुद्दा, मुझे लगता है कि कष्टप्रद हिस्सा "टीएस जेएस का सुपरसेट है" का गलत विज्ञापन है - ठीक है, बिल्कुल नहीं। यह उस का एक आदर्श उदाहरण है।
पैट्रिक

जवाबों:


3

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

// Ensure we can not pass regular map to our custom functions
type SymbolMapTag = { readonly symbol: unique symbol }

type SymbolMap = SymbolMapTag & {
    [Key in string | number | symbol]: string;
}

function set_symbol<T extends SymbolMap, TSym extends symbol>
(target: T, sym: TSym, value: T[TSym]) {
    target[sym] = value;
}

function get_symbol<T extends SymbolMap, TSym extends symbol>
(target: T, sym: TSym): T[TSym] {
    return target[sym];
}

const symbol_map = {} as SymbolMap;

const sym = Symbol('My symbol');
set_symbol(symbol_map, sym, "hi");
get_symbol(symbol_map, sym); // string


type NonSymbolMap = {
    [Key in string | number]: string;
}

const non_symbol_map = {} as NonSymbolMap;
set_symbol(non_symbol_map, sym, "hi"); // error
get_symbol(non_symbol_map, sym); // error
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.