क्या जावास्क्रिप्ट फ़ाइलों को टाइपस्क्रिप्ट में बदलने के लिए एक उपकरण है [बंद]


133

अब टाइपस्क्रिप्ट बाहर आया, यह मेरे लिए एक रोमांचक खबर है, लेकिन मैं सभी मौजूदा जावास्क्रिप्ट फाइलों को टाइपस्क्रिप्ट में कैसे बदल सकता हूं।


3
आपकी सभी जावास्क्रिप्ट फाइलें पहले से ही टाइपस्क्रिप्ट फाइलें हैं क्योंकि टाइपस्क्रिप्ट जावास्क्रिप्ट का सुपरसेट है।
बेंजामिन Gruenbaum

6
यह ऑफ-टॉपिक के विपरीत है, एक प्रोग्रामिंग लैंग्वेज से दूसरे में कनवर्ट करना पूरी तरह से एक प्रोग्रामिंग प्रश्न है।
इवान कैस्टेलानोस

2
@Tony_Henrich खैर तब इसे "ऑफटॉपिक के रूप में बंद" के बजाय वहां ले जाया जाना चाहिए था, और इस तरह की साइट पर सॉफ्टवेयर इंजीनियरों के लिए इच्छित सॉफ़्टवेयर सिफारिशों के लिए एक स्पष्ट श्रेणी होनी चाहिए।
इवान कास्टेलानोस

3
@Tony_Henrich Lets ने इसे इस प्रकार रखा है: यह "कन्वर्ट जावास्क्रिप्ट को टाइपस्क्रिप्ट में बदलने" के लिए इंटरनेट पर शीर्ष परिणाम है और सबसे अच्छी बात आप इसे आगे के उत्तरों से बंद कर सकते हैं और इसे ऑफ-टॉपिक कह सकते हैं? मुझे लगता है कि इस तरह की संकीर्ण सोच इस साइट का निधन होगी।
इवान कैस्टेलानोस

5
हास्यास्पद है कि यह विषय के रूप में बंद था।
भाल

जवाबों:


112

मुझे डर है कि यह बहुत समस्याग्रस्त होगा। टाइपस्क्रिप्ट जावास्क्रिप्ट का एक सुपरसेट है । इसका अर्थ है कि सभी मान्य जावास्क्रिप्ट कोड भी मान्य टाइपस्क्रिप्ट कोड हैं। जो सिर्फ गलत है। जावास्क्रिप्ट में निम्नलिखित कोड सही है, लेकिन टाइपस्क्रिप्ट में एक त्रुटि बनाता है:

var data={x:5, y:6};
data.z=5;

आप डेटा को "परिवेश" घोषित करके जावास्क्रिप्ट का गतिशील व्यवहार प्राप्त कर सकते हैं

var data:any={x:5, y:6};
data.z=5;

अब यह टाइपस्क्रिप्ट में भी काम करेगा। फिर भी आप एक .js फ़ाइल के एक्सटेंशन को .ts को बदल सकते हैं और इस फ़ाइल को टाइपस्क्रिप्ट कंपाइलर को पास कर सकते हैं। यह वास्तव में मुझे भ्रमित करता है और मैंने फरिनोड पर टाइपस्क्रिप्ट आईआरसी चैनल में सवाल पूछा है। यह पता चला कि टाइपस्क्रिप्ट कंपाइलर वैध जावास्क्रिप्ट के लिए अपने इनपुट की जांच करता है और अगर उसे कुछ मिलता है तो वह कुछ भी नहीं करता है। सहज रूप से यह अच्छा लगता है। आपको फ़ाइल एक्सटेंशन को केवल अपडेट करके अपने सभी जावास्क्रिप्ट को टाइपस्क्रिप्ट में "कन्वर्ट" करने में सक्षम होना चाहिए और जाने के लिए अच्छा होना चाहिए। दुर्भाग्य से यह उम्मीद के मुताबिक काम नहीं करता है। मान लेते हैं कि आपको यह कोड मिल गया है:

var func=function(n){alert(n)};

var data={x:5};
data.z=6;

संपादित करें: मैंने इसे संकलित करने की कोशिश की है और यह काम नहीं करता है। मुझे क्षमा करें, मुझे लगता है कि गलती हुई है: टाइपस्क्रिप्ट कंपाइलर भी शुद्ध जावास्क्रिप्ट को स्वीकार नहीं करता है। मैं यह पता लगाने की कोशिश करूंगा कि क्या गलत हुआ।

आपने फ़ाइल एक्सटेंशन को .ts में बदल दिया है और अपने अन्य कोड में फ़ंक्शन फ़ंक्शंस का उपयोग किया है। पहले तो सब कुछ ठीक लगता है लेकिन फिर एक बदसूरत बग उठ जाती है। आप तय करते हैं कि कुछ स्थैतिक प्रकार की जाँच शायद आपकी मदद करेगी और आप कोड को बदलेंगे:

var func=function(n:string){alert(n)};

var data={x:5};
data.z=6;

लेकिन अब यह जावास्क्रिप्ट कोड मान्य नहीं है और यह कंपाइलर को बहुत सारे एरर मैसेज जेनरेट करेगा। सभी डेटा के बाद कोई भी सदस्य "z" नहीं है। ... इस व्यवहार से बचा जा सकता है यदि डिफ़ॉल्ट प्रकार हमेशा "कोई भी" होगा, लेकिन तब प्रकार का अनुमान पूरी तरह से बेकार होगा।

तो आप इस समस्या को कैसे हल करते हैं? इसका उत्तर है: घोषणा फाइलें। आप प्रोजेक्ट में अपने जावास्क्रिप्ट कोड "जैसा है" का उपयोग कर सकते हैं और फिर भी कुछ .d.ts फ़ाइलों की मदद से स्थिर प्रकार की जाँच कर सकते हैं। वे संकलक को सूचित करते हैं कि एक जावास्क्रिप्ट फ़ाइल में चर, विधियां और "वर्ग" क्या हैं, उनके प्रकार भी शामिल हैं। इसलिए वे संकलन-समय प्रकार की जाँच और शानदार परिचय के लिए अनुमति देते हैं। मेरे उदाहरण के लिए .d.ts फ़ाइल होगी

declare var data:any;
declare function func(n:string);

इसे "myjsfile.d.ts" के रूप में सहेजें और इसे टाइपस्क्रिप्ट के साथ आयात करें

///<reference path="myjsfile.d.ts"/>

संकलित टाइपस्क्रिप्ट के ऊपर अपनी HTML फ़ाइल में जावास्क्रिप्ट स्क्रिप्ट शामिल करना सुनिश्चित करें। यहाँ एक दिलचस्प कड़ी है । आपको "टाइपिंग जावास्क्रिप्ट को टाइपस्क्रिप्ट में" अनुभाग में रुचि हो सकती है।


57
+1 इंगित करने के लिए कि सभी वैध जेएस वैध टीएस नहीं है।
केन स्मिथ

14
वास्तव में, आपके द्वारा पोस्ट किए गए सभी जावास्क्रिप्ट स्निपेट वैध प्रकार हैं। आपको बस कुछ संकलक स्विच बंद करने की आवश्यकता है जैसे-noImplictAny, आदि। हालांकि, इसका अच्छा विचार है कि उन्हें अंततः चालू करें और जहां आवश्यक हो वहां टाइप एनोटेशन जोड़ें
Liero

धन्यवाद। मुझे लोगों के कहने पर तर्क के अलावा कुछ नहीं मिलता है, टाइपस्क्रिप्ट जावास्क्रिप्ट का सुपरसेट नहीं है, चाहे मैं कोई भी उदाहरण प्रदान करूं। आखिरकार लोग इस तर्क पर छोड़ देते हैं कि मैं उन्हें क्यों दिखाता हूं, और फिर वे अगले हफ्ते ही तर्क देते हैं जैसे कि हलवा में सबूत भूल जाते हैं। " सभी मान्य जावास्क्रिप्ट कोड भी मान्य टाइपस्क्रिप्ट कोड है ... बस गलत है " - LHK
कोडी

3
टाइपस्क्रिप्ट के साथ टाइपस्क्रिप्ट "त्रुटियों" के बावजूद जावास्क्रिप्ट में संकलन की अनुमति देने के साथ (इस उत्तर में जावास्क्रिप्ट के सभी प्रकार के टाइपस्क्रिप्ट के वर्तमान डेमो संस्करण में कोई समस्या संकलन नहीं है), यह एक सुपरसेट के रूप में काम करता है - कम से कम उन जावास्क्रिप्ट सुविधाओं के साथ जो टाइपस्क्रिप्ट कंपाइलर हैंडलिंग में सक्षम है ...
ब्रेट ज़मीर

हाँ, मैं इस मुद्दे के "दोनों पक्षों पर" रहा हूँ। असल में, TS इस अर्थ में JS का एक सुपरसेट है कि: टाइपस्क्रिप्ट कुछ वैध JS कोड के बारे में शिकायत करेगा, लेकिन जब तक noEmitOnErrorयह बंद है, तब भी यह अपने ट्रांसप्लीकेशन को संचालित और उत्सर्जित करने में सक्षम है। इस प्रकार, जबकि यह त्रुटियों को दिखाता है (जो परेशान है), आप वास्तव में उन त्रुटियों को अनदेखा कर सकते हैं और इसके बावजूद टाइपस्क्रिप्ट ट्रांसप्लिकेशन का उपयोग कर सकते हैं (उदाहरण के लिए, जेएस से टीएस के क्रमिक संक्रमण)। साथ ही, कम से कम कुछ त्रुटियों को स्विच के माध्यम से अक्षम किया जा सकता है noImplicitAny, जैसे (शायद सभी, हालांकि आईडीके)।
वेनरिक्स

51

अपडेट: इस पोस्ट में विवरण में टूल का वर्णन किया गया है

संस्करण 9 ( ईएपी बिल्ड उपलब्ध ) के साथ शुरू होने वाले रिस्पर में जावास्क्रिप्ट कोड को टाइपस्क्रिप्ट में स्वचालित रूप से बदलने की कार्यक्षमता होती है। आप .js फ़ाइल को .ts में नाम बदलने के साथ शुरू कर सकते हैं और R # सुझावों को इस तरह देख सकते हैं:

वास्तविक दुनिया के उदाहरणों पर इसे आजमाया नहीं गया। लेकिन यह बड़ी संख्या में जावास्क्रिप्ट पैटर्न को बदलने में सक्षम है।


मैं हाथ से संपादित मेटा फ़ाइलों का उपयोग करके मक्खी पर ऐसा करना पसंद करूंगा, जिससे सभी टीएस ब्लोट की जरूरत हो।
xamiro

नमस्कार, मैं resharper का उपयोग कर रहा हूँ, इसलिए केवल .js से .ts को ही ठीक करना है? जैसे मैं a.js फ़ाइल का उपयोग कर रहा हूँ और फ़ाइल का नाम बदलना wih a.ts है पुनर्परिभाषित कोई सुझाव देगा? मैं दृश्य स्टूडियो सामुदायिक संस्करण का उपयोग कर रहा हूं और
Swift

1

टर्मिनल (मैक) से:

for f in *.js; do mv $f `basename $f .js`.ts; done;

सभी .js फ़ाइलों को .ts के लिए नया नाम देता है

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

GNU खोज के साथ (अधिकांश * निक्स) + बैश, बस करें:

find -type f -name '*.js' -exec bash -c 'mv "${1}" "${1%???}.ts"' bash {} \;

10
+1 - यह एक तरह से एक संक्षिप्त किताब को वापस पूर्ण संस्करण में स्वचालित रूप से बदलने की कोशिश कर रहा है।
फेंटन

सभी प्रकार की जानकारी हटा दी जाती है और सभी इंटरफेस हटा दिए जाते हैं - यह काफी जानकारी चली गई है। कोई भी जावास्क्रिप्ट जिसमें टाइप की जानकारी का पता लगाने के लिए पर्याप्त जानकारी है, उसे पहले ही टाइपस्क्रिप्ट फ़ाइल में चिपकाया जा सकता है और कंपाइलर प्रकारों को काम करेगा, लेकिन ऐसे कई उदाहरण हैं जो काम नहीं करेंगे क्योंकि जावास्क्रिप्ट संगत नहीं है।
फेंटन

1
क्या हालांकि से परिवर्तित? JS से प्रकारों को देना और उन्हें var में जोड़ना? निश्चित नहीं है कि क्या स्वचालित रूप से परिवर्तित किया जा सकता है, यह सुनिश्चित नहीं है कि कक्षाएं, इंटरफेस, मॉड्यूल कैसे निकाले जा सकते हैं (पूरी तरह से)।
7zark7

4
: सभी जावा स्क्रिप्ट कोड टाइपप्रति में मान्य है, इस कोशिशvar a = 5; a = "";
coudy

4
दूसरा, और डाउनवोट को सही ठहराने के लिए, आपको बहुत जल्दी पता चलेगा कि सभी जेएस कोड टाइपस्क्रिप्ट में मान्य नहीं हैं, जब आप मॉड्यूल या प्लग इन को टाइपस्क्रिप्ट से उनके मूल जेएस से बदलने का प्रयास करते हैं (जैसे: jquery.address, आदि)
dpb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.