टाइपस्क्रिप्ट के साथ स्प्रेड सिंटैक्स और नए सेट () का उपयोग करना


95

मैं अद्वितीय संख्या प्राप्त करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं:

let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]

हालाँकि, त्रुटि के बाद टाइपस्क्रिप्ट रिपोर्ट: टाइप 'सेट' एक सरणी प्रकार नहीं है। मैं टाइपस्क्रिप्ट निंजा नहीं हूं, क्या कोई मुझे बता सकता है कि यहां क्या गलत है?


4
मुझे लगता है कि यह केवल एक टाइपस्क्रिप्ट बग है, यदि संस्करण आप ES2015 का समर्थन करने के दावों का उपयोग कर रहे हैं।
पोइंट्टी

1
@ इसके बारे में क्षमा करें, मुझे tsc का संस्करण शामिल करना चाहिए जो 1.6.2 है
Eggy

जवाबों:


46

यह एक गायब सुविधा है। टाइपस्क्रिप्ट वर्तमान में केवल एर्रेज़ पर पुनरावृत्तियों का समर्थन करता है।


स्पष्टीकरण के लिए धन्यवाद। मैं .filter () या कुछ और काम करने के लिए उपयोग करेंगे। मुझे इस विशेष त्रुटि के बारे में जीथब पर कुछ मुद्दे भी मिले। मैं भविष्य में रिलीज पर इस पर नजर रखूंगा।
एग्गी

104

अपडेट : टाइपस्क्रिप्ट 2.3 के साथ, अब आप "downlevelIteration": trueअपने tsconfig में जोड़ सकते हैं , और यह ES5 को लक्षित करते हुए काम करेगा।

नकारात्मक पक्ष यह downlevelIterationहै कि टीएस को ट्रांसप्लीनिंग करते समय काफी बॉयलरप्लेट को इंजेक्ट करना होगा। जोड़े गए बायलरप्लेट की 21 लाइनों के साथ प्रश्न ट्रांसपाइल्स से सिंगल लाइन: (टाइपस्क्रिप्ट 2.6.1 के रूप में)

यह बॉयलरप्लेट एक बार प्रति फ़ाइल में इंजेक्ट किया जाएगा "importHelpers"जो डाउनलेवल पुनरावृत्ति का उपयोग करता है, और tsconfig के माध्यम से विकल्प का उपयोग करके इस बॉयलरप्लेट को कम किया जा सकता है । ( इस ब्लॉगपोस्ट को डाउनलेवल पुनरावृत्ति पर देखें औरimportHelpers )

वैकल्पिक रूप से, यदि आपके लिए ES5 समर्थन मायने नहीं रखता है, तो आप हमेशा "es6" को पहले स्थान पर लक्षित कर सकते हैं, इस स्थिति में मूल कोड "downlevelIteration" ध्वज की आवश्यकता के बिना काम करता है।


मूल उत्तर:

यह एक टाइपस्क्रिप्ट ES6 ट्रांसप्लीकेशन क्वर्क लगता है। ...ऑपरेटर कुछ भी पुनरावर्तक संपत्ति, (द्वारा पहुंच की है पर काम करना चाहिए obj[Symbol.iterator]) और समूह है कि संपत्ति है।

इसके चारों ओर काम करने के लिए, आप Array.fromसेट को पहले सरणी में बदलने के लिए उपयोग कर सकते हैं ...Array.from(new Set([1, 2, 3, 1, 1])):।


@Restam: IE में अगर "लक्ष्य": "es5" tsconfig.json में Array.from के लिए टाइपस्क्रिप्ट पॉलीफ़िल प्रदान करता है?
जैकऑफऑल

1
@jackOfAll नहीं, टाइपस्क्रिप्ट आपके लिए प्रोटोटाइप की कोई भी पॉलीफ़िलिंग नहीं करता है। यदि आप "लक्ष्य": "es5" सेट करते हैं, तो आपको एक संकलक त्रुटि देनी चाहिए यदि आप एक ऐसी विधि का उपयोग करने का प्रयास करते हैं जिसे पॉलीस्टिल करने की आवश्यकता होती है।
रतसम

1
साथ महान समाधान @Restam Array.from। अधिकांश अन्य लोगों को सिर्फ इस पर छोड़ देना लगता है। एक वास्तविक समाधान के लिए धन्यवाद!
किरणे

यह बग नहीं है, वे इसे es5लक्ष्य के लिए समर्थन नहीं करते हैं (देखें github.com/Microsoft/TypeScript/issues/iss31/ )। tsconfig में अपनी सूची में Array.fromयदि आपके पास es2015उच्च या ( es2017, esnext) काम करना चाहिए lib
बजे साइमन होइकिन

1
@ साइमनहैकिसक लिंक के लिए धन्यवाद: मैंने अपना जवाब अपडेट कर दिया है, मैं अब इसे "बग" नहीं कहता, लेकिन "ट्रांसप्लिकेशन क्विक", जो शायद अधिक सटीक शब्द है। मैंने उस लिंक से डाउनलेवल इटरेशन विकल्प के बारे में भी जानकारी जोड़ी, जो मूल मुद्दे को भी हल करता है।
रत्सम

74

सेट को Array में बदलने के लिए आप Array.from विधि का भी उपयोग कर सकते हैं

let uniques = Array.from(new Set([1, 2, 3, 1, 1])) ;
console.log(uniques);


केवल नए सरणी में इसे पुनः प्राप्त करने के लिए सरणी को फैलाने का क्या मतलब है?
रॉबी कॉर्नेलिसन

1
यदि tsconfig में "es6" को लक्षित करना संभव नहीं है। और प्रसार ऑपरेटर के साथ सेट का उपयोग करना आवश्यक है, आप इसे कैसे करेंगे?
नैट गेटच

मुद्दा यह है कि यदि आप उपयोग करते हैं Array.from(), तो आपको अब प्रसार ऑपरेटर की आवश्यकता नहीं है। यह सिर्फ उपरि जोड़ता है। let uniques = Array.from(new Set([1, 2, 3, 1, 1]));
रॉबी कॉर्नेलिसन

9

आपको "target": "es6",अपने tsconfig में सेट करना होगा।


1

जावास्क्रिप्ट में:

[ ...new Set([1, 2, 3, 1, 1]) ]

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

Array.from(new Set([1, 2, 3, 1, 1]))

प्रतिक्रिया स्थिति में (सेट करें):

setCart(Array.from(new Set([...cart, {title: 'Sample', price: 20}])));

0

इसे काम करने के लिए, आपको "लक्ष्य" की आवश्यकता है: "ES6" (या उच्चतर) या "downlevelIteration": अपने tsconfig.json के संकलक में सही। इसने मेरे मुद्दे को हल किया और अच्छा या मुझे काम करना चाहिए। इससे आपको भी मदद मिलेगी।

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