2016-12-01 6 views
17

एक साधारण टीएस पैकेज है जिसका उपयोग कॉमनजेएस मॉड्यूल के रूप में किया जाता है और इसमें कोई निर्यात नहीं होता है। टीएस फाइलें उसी नाम से जेएस फाइलों में संकलित की जाती हैं और require('package/option-foo') के रूप में उपयोग की जाती हैं।'असंबंधित फ़ाइलों में' ब्लॉक-स्कोप्ड वैरिएबल को पुन: संग्रहित नहीं कर सकता '

tsconfig.json:

{ 
    "compilerOptions": { 
    "target": "es5" 
    } 
} 

विकल्प-foo.ts:

declare const GlobalVar: any; 

function baz() {} 

if (GlobalVar.foo) GlobalVar.baz = baz; 

विकल्प-bar.ts:

declare const GlobalVar: any; 

function baz() {} 

if (GlobalVar.bar) GlobalVar.baz = baz; 

यहाँ महत्वपूर्ण हिस्सा है कि option-foo और option-barकभी भी के साथ उपयोग नहीं किया जाता है। प्रोजेक्ट में अन्य मानार्थ टीएस फाइलें हैं, लेकिन वे किसी भी चीज को प्रभावित नहीं करते हैं, केवल एक tsc रन में जेएस को पारदर्शी होने की आवश्यकता है।

tsc रन फेंक देता है जब

ब्लॉक-दायरे चर redeclare नहीं कर सकता 'GlobalVar'।

डुप्लिकेट फ़ंक्शन कार्यान्वयन।

ब्लॉक-स्कोप्ड वेरिएबल 'ग्लोबलवायर' को फिर से नहीं चलाया जा सकता है।

डुप्लिकेट फ़ंक्शन कार्यान्वयन।

GlobalVar और baz दोनों फ़ाइलों में।

बिल्ड प्रक्रिया को जटिल किए बिना या इन दो टीएस फ़ाइलों के आउटपुट के बिना इसका इलाज कैसे किया जा सकता है?

+0

इस विशिष्ट मामले में, आपके पास 'custom-typings.d.ts' फ़ाइल की तरह कुछ हो सकता है और अगर वे दोनों' हैं 'तो बस इसे घोषित करें। आप इच्छित '- मॉड्यूल' संकलन को बदलने का प्रयास भी कर सकते हैं (एएमडी/सिस्टम आज़माएं, क्योंकि मुझे लगता है कि वे अलग-अलग फाइलों को स्कॉप करते हैं)। – Seiyria

उत्तर

32

टी एल; डॉ बस export {} बारे में आपकी फाइलों के बाहरी दायरे में।


कुछ बिंदु पर वहाँ के लिए एक फ़ाइल एक मॉड्यूल के रूप में व्यवहार किया जाना चाहिए कि क्या एक अर्थ बहुविकल्पी हो (और अपने स्वयं के गुंजाइश होनी) (अन्य लिपियों के साथ वैश्विक गुंजाइश या एक स्क्रिप्ट और साझा करने के लिए की जरूरत है)।

ब्राउज़र में, यह आसान है - आप <script type="module"> टैग का उपयोग करने में सक्षम होना चाहिए और आप मॉड्यूल का उपयोग करने में सक्षम होंगे।

लेकिन जावास्क्रिप्ट का उपयोग करने वाले किसी भी अन्य स्थान के बारे में क्या?दुर्भाग्यवश उस भेद को बनाने के लिए इस बिंदु पर एक मानक तरीका नहीं है।

जिस प्रकार टाइपस्क्रिप्ट ने समस्या से निपटने का फैसला किया वह बस यह बताता था कि एक मॉड्यूल कोई फ़ाइल है जिसमें आयात या निर्यात है।

इसलिए यदि आपकी फ़ाइल में शीर्ष-स्तर import या export कथन का कोई प्रकार नहीं है, तो आप कभी-कभी वैश्विक घोषणाओं के साथ-साथ एक दूसरे के साथ हस्तक्षेप के मुद्दों को भी देखेंगे।

इसके आसपास पाने के लिए, आप आसानी से export कथन कर सकते हैं जो कुछ भी निर्यात नहीं करता है। दूसरे शब्दों में, बस

export {}; 

कहीं भी अपनी फ़ाइल के शीर्ष-स्तर पर लिखें।

+0

दूसरे विचार पर, मैंने इस समाधान के साथ समाप्त किया, यह सिर्फ काम करता है। धन्यवाद। – estus

+0

यह इस समस्या के बारे में सबसे अच्छी व्याख्या है। यह समस्या मुझे थोड़ी देर तक भ्रमित करती है। आज, मुझे अंततः कारण मिल गया। – novaline

+0

तो यह टीएस कंपाइलर है जो शिकायत कर रहा है, रनटाइम समस्या नहीं, परेशान है। क्या इस तरह टीएस त्रुटियों को अनदेखा करने का कोई तरीका है? –

8

ग्लोबलवार और फ़ंक्शंस वैश्विक स्थान पर आते हैं, और टाइपस्क्रिप्ट आपको चेतावनी देते हैं कि वेरिएबल और विधि का नाम फिर से घोषित किया गया है। क्योंकि वैश्विक कार्यक्षेत्र में दो फ़ंक्शन घोषित किए जाते हैं, आपको केवल एक बार घोषित करने की आवश्यकता होती है। यदि आप ऐसा करना चाहते हैं। उपयोग नामस्थान

namespace foo{  
    declare const GlobalVar: any; 
    function baz() {} 

} 

namespace bar{ 
declare const GlobalVar: any; 
function baz() {} 
} 

आप समारोह सी # में के रूप में bar.baz से पहले नाम स्थान नाम का उपयोग करके, इस मदद कॉल कर सकते हैं foo.baz

आशा आप

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