2015-04-28 6 views
15

मैंने अभी टाइपस्क्रिप्ट का उपयोग करना शुरू किया और कभी-कभी संकलक त्रुटियों को "अविकसित चर का उपयोग" मिलता है। उदाहरण के सादे JavaScript में निम्न काम करता है के लिए:टाइपस्क्रिप्ट वास्तव में जावास्क्रिप्ट का सुपरसैट है?

var foo = {}; 
foo.bar = 42; 

अगर मैं यह काम नहीं करेगा और मुझे ऊपर उल्लेख किया त्रुटि दिखा सकते हैं टाइपप्रति में भी ऐसा ही करने की कोशिश करो। मैं इसे इस तरह लिखने के लिए है:

var foo :any = {}; 
foo.bar = 42; 

सादा में जावास्क्रिप्ट किसी के साथ प्रकार परिभाषा न आवश्यक है और न ही मान्य है, लेकिन टाइपप्रति में यह अनिवार्य हो रहा है। मैं त्रुटि और इसके लिए कारण समझते हैं, लेकिन मैं हमेशा वीडियो में सुना और दस्तावेज में पढ़ें:

typescriptlang.org:

"टाइपप्रति जावास्क्रिप्ट का एक टाइप किया सुपरसेट [...] है"

Introduction Video @minute 3:20: ", बस कॉपी और पेस्ट सभी जावा स्क्रिप्ट कोड टाइपप्रति कोड है"

क्या यह चीज टाइपस्क्रिप्ट के विकास के दौरान बदल गई है या क्या मुझे यह काम करने के लिए एक विशिष्ट कंपाइलर सेटिंग पास करनी है?

+2

यह एक सुपरसेट है। लेकिन इसका मतलब यह नहीं है कि यह 1) संकलित और 2) नियमित जावास्क्रिप्ट के रूप में उपयोग किया जा सकता है। उद्देश्य-सी सी/++ का सुपरसेट है, लेकिन यह अपने स्वयं के कंपाइलर/आईडीई/पर्यावरण के साथ जाता है। आपको टाइपस्क्रिप्ट निर्देशों का पालन करना होगा और इसकी तुलना इसकी तुलना नहीं करना चाहिए जो सचमुच जावास्क्रिप्ट पर है। –

+2

हम्म, शायद यह सिर्फ खराब शब्द है। यह वास्तव में एक * त्रुटि * नहीं है? अधिक * चेतावनी * क्योंकि यह वैध जावास्क्रिप्ट उत्पन्न करता है। निश्चित रूप से टाइपप्रति अक्सर दलालों कि संकलक * "बस काम" चाहिए * – CodingIntrigue

+0

@AndreyPopov लिए जावास्क्रिप्ट दे रही है: ठीक है, लेकिन यह जावास्क्रिप्ट की और विशेष रूप से दूसरी बोली में एक वाक्यात्मक सुपर सेट नहीं है की तुलना में फ्लैट गलत है ... – Markus

उत्तर

11

टाइपस्क्रिप्ट के अस्तित्व का कारण एक कंपाइलर और भाषा है जो वेनिला जावास्क्रिप्ट से बेहतर प्रकारों को लागू कर सकता है। कोई नियमित जावास्क्रिप्ट वैध टाइपस्क्रिप्ट, वाक्य रचनात्मक रूप से है। इसका मतलब यह नहीं है कि संकलक इसके साथ पूरी तरह से खुश होना चाहिए। वेनिला जावास्क्रिप्ट में अक्सर कोड होता है जो कि प्रकार की सुरक्षा के मामले में समस्याग्रस्त है। यह अमान्य टाइपस्क्रिप्ट कोड नहीं बनाता है, लेकिन यह कारण है कि टाइपस्क्रिप्ट मौजूद है और यह वास्तव में उन समस्याओं को इंगित करने के लिए संकलक का काम है।

भाषा जैसे कि अभी भी एक दूसरे के उप/सुपरसेट हैं।

+2

आपने जो शब्दों को महसूस किया वह शब्दों में डाल दिया और वास्तव में वर्णन करने के लिए सही शब्द नहीं मिल सका। टाइपस्क्रिप्ट कोड संकलित करता है और जावास्क्रिप्ट आउटपुट –

+3

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

3

परिभाषा

"सभी जावा स्क्रिप्ट कोड टाइपप्रति कोड है, बस कॉपी और पेस्ट"

सच है। क्योंकि कोई जावास्क्रिप्ट कोड टाइपस्क्रिप्ट कंपाइलर को पास कर सकता है।

तो यह जावास्क्रिप्ट के शीर्ष पर एक परत का प्रकार है। तो, निश्चित रूप से अंडरलेइंग लेयर (जावास्क्रिप्ट) परतों के माध्यम से शीर्ष (टाइपस्क्रिप्ट), पर पारित किया जा सकता है लेकिन दूसरी तरफ नहीं।

क्यों नहीं?

इसे बाइक (जावास्क्रिप्ट) और मोटरसाइकिल (टाइपस्क्रिप्ट) के रूप में सोचें। मूल बातें एक ही हैं (दो पहियों, एक फ्रेम), लेकिन मोटरसाइकिल एक इंजन के रूप में और कुछ उन्नत सुविधाओं के रूप में।

तो, आप अपनी मोटरसाइकिल (टाइपस्क्रिप्ट) को बाइक (जावास्क्रिप्ट) के रूप में उपयोग कर सकते हैं, लेकिन आप मोटरसाइकिल के रूप में बाइक का उपयोग नहीं कर सकते हैं।

संपादित करें: अपने संकलक एक चेतावनी फेंकता

हैं, तो क्यों यह बयान गलत है? यह सिर्फ कहता है: अरे, आप टाइपस्क्रिप्ट का उपयोग कर रहे हैं, और यह आपने जो कुछ दिया है उससे अधिक सख्त है।

See this example, यह जावास्क्रिप्ट को पूरी तरह से संकलित करता है, लेकिन एक चेतावनी फेंकता है।

+5

यदि आप टाइपस्क्रिप्ट कंपाइलर को कोई जेएस कोड पास कर सकते हैं, तो वैध जावास्क्रिप्ट ('var foo = {}; foo.bar = 42;') त्रुटि/चेतावनी क्यों फेंकता है? – JJJ

+0

आप एक .ts फ़ाइल में सादा जावास्क्रिप्ट लिख रहे हैं। आप अपने सादे बाइक के साथ एक मोटर इंजन का उपयोग करने की कोशिश करते हैं। एक .js फ़ाइल पूरी तरह से "संकलित" हो जाता है। –

+5

@gruberb लेकिन मुद्दा यह है कि यह * नहीं * है। देखें ओपी ने वैध जेएस दिया है और यह एक त्रुटि फेंकता है - मुझे यह पहली बार – CodingIntrigue

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