2015-12-17 4 views
9

शुभ संध्या।संकलित आउटपुट में टाइपस्क्रिप्ट निर्भरता सही क्रम में हल नहीं होती है

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

मेरी टाइपस्क्रिप्ट परियोजना "मायएप" (पूरी तरह से ऑब्जेक्ट उन्मुख, जिसे विजुअल स्टूडियो 2013 में विकसित किया जा रहा है) कहा जाता है, एक एकल आउटपुट फ़ाइल (main.js, ECMAScript 5) में संकलित करने के लिए सेट है, जिसे तब ब्राउज़र में चलाया जाता है। कोई मॉड्यूल लोडिंग सॉफ़्टवेयर (जैसे एएमडी) का उपयोग नहीं किया जाता है, और मैं इसे इस तरह से रखना चाहता हूं। प्रोजेक्ट में संदर्भित सभी टाइपस्क्रिप्ट फ़ाइलें (.ts) स्वचालित रूप से संकलित की जाती हैं, /// <reference path> का उपयोग करके उन्हें मैन्युअल रूप से संदर्भित करने की आवश्यकता नहीं है।

App_Script/Score.ts

namespace MyApp.App_Script { 
    export class Score { 
     protected tracks: MyApp.App_Script.Entities.Track[]; 
     ... 
    } 
} 

नाम स्थान संरचना निर्देशिका लेआउट को दर्शाता है:

मैं इस फ़ाइल (Score.ts), नाम स्थान संरचना में एक स्तर गहरी है

MyApp 
|-- App_Script 
| |-- Entities 
| | |-- Track.ts 
| | |-- Note.ts 
| | `-- ... 
| |-- Loader.ts 
| |-- Score.ts 
| `-- ... 
`-- main.ts 

Score कक्षा main.ts फ़ाइल में तत्काल है (इस फ़ाइल को एकवचन "प्रविष्टि पी माना जा सकता है oint "आवेदन) है, जो सामग्री MyApp नेम स्पेस में संलग्न है में:

main.ts

namespace MyApp { 
    import Score = MyApp.App_Script.Score; 

    var score: Score = new Score(); 

    score.init(); 
    ... 
} 

ऊपर कोड (ऊपर निर्देशिका लेआउट पर दिखाया सभी अतिरिक्त निर्भरता के साथ के अलावा) के बिना संकलित मुद्दों, और सही ढंग से, अच्छा और चिकनी चलाता है।

App_Script/Score.ts

namespace MyApp.App_Script { 
    import Track = MyApp.App_Script.Entities.Track; 

    export class Score { 
     protected tracks: Track[]; 
     ... 
    } 
} 

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

लेकिन जब ब्राउज़र में भाग गया,

main.js: पढ़ा नहीं जा सकता गुण अपरिभाषित के 'ट्रैक'।

... जो कोई आश्चर्य नहीं है, क्योंकि यह है कि क्या नामित उत्पादन जावास्क्रिप्ट फ़ाइल की तरह दिखता है की एक शुरुआत के abomination (इन बहुत उत्पादन में पहली लाइनें हैं):

मुख्य।js

var MyApp; 
(function (MyApp) { 
    var App_Script; 
    (function (App_Script) { 
     var Track = MyApp.App_Script.Entities.Track; // PLEASE LEAVE 
     var Score = (function() { 
      function Score() { 
       this.tracks = []; 

       for (var i = 0; i < 4; i++) { 
        // shouldn't this be "new MyApp.App_Script.Entities.Track()"? 
        // if I rewrite it manually, it works 
        this.tracks.push(new Track()); 
       } 
      } 
      return Score; 
     })(); 
     App_Script.Score = Score; 
    })(App_Script = MyApp.App_Script || (MyApp.App_Script = {})); 
})(MyApp || (MyApp = {})); 
... 

Track के लिए परिभाषा वास्तव में संकलित उत्पादन का नीचे (जब यह शीर्ष पर होना चाहिए) पर है:

main.js

... 
var MyApp; 
(function (MyApp) { 
    var App_Script; 
    (function (App_Script) { 
     var Entities; 
     (function (Entities) { 
      var Track = (function() { 
       function Track() { 
        ... 
       } 
       return Track; 
      })(); 
      Entities.Track = Track; 
     })(Entities = App_Script.Entities || (App_Script.Entities = {})); 
    })(App_Script = MyApp.App_Script || (MyApp.App_Script = {})); 
})(MyApp|| (MyApp = {})); 
... 

यहां मैंने देखा है: यदि आप import एक सीएल गधा, यह ठीक है (अंक बिना किसी मुद्दे के main.ts से आयात किया जाता है)। यदि आप import किसी नामस्थान में एक वर्ग है जिसमें एक निर्यातित क्लास है जिसे कहीं और आयात किया जाता है, तो संकलक बार्फ़ प्रक्रिया के दौरान किसी भी त्रुटि की रिपोर्ट किए बिना अनुपयोगी कोड को अवरुद्ध करता है।

क्या यह टाइपस्क्रिप्ट कंपाइलर में एक बग है, या क्या यह कुछ पूरी तरह से छोटा है, मुझे याद आ रही है? मैं मॉड्यूल लोडिंग सिस्टम का उपयोग नहीं करना चाहता, क्योंकि यह कंपाइलर के साथ एक मुद्दा प्रतीत होता है, और कोड ब्राउज़र में चलाएगा।

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

उत्तर

7

इस टाइपप्रति संकलक

नहीं

में एक बग है या यह सिर्फ पूरी तरह से तुच्छ मुझे याद आ रही कुछ है?

हाँ

मैं एक मॉड्यूल लोड हो रहा है इस प्रणाली का उपयोग नहीं करना चाहते हैं,

आप शायद चाहिए, क्योंकि आप फ़ाइल आदेश है मुद्दों

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

यह करना गलत होगा। इस तरह की कुछ कोड पर विचार करें:

namespace Z { 
    export var A = 10; 
} 

namespace X { 
    import Y = Z.A; 
    namespace Q { 
    let Z = { A: 20 }; 
    // If we replaced 'Y' with 'Z.A', as proposed, 'a' would be 20 
    // when it should be 10 
    let a = Y; 
    } 
} 

समस्या है कि यहाँ टाइपप्रति स्वचालित रूप से क्या आदेश आपकी फ़ाइलों में श्रेणीबद्ध किया जाना चाहिए लगता है कि नहीं करता है

ठीक या तो फाइलों को /// <reference ... टैग जोड़ने के लिए है। ताकि संकलक यह पता लगा सके कि आप फ़ाइल ऑर्डर क्या चाहते हैं, या कमांडलाइन पर फ़ाइलों को ऑर्डर करने के क्रम में मैन्युअल रूप से निर्दिष्ट करें, जिसे आप आउटपुट फ़ाइल में दिखाना चाहते हैं।

+0

धन्यवाद, फ़ाइल को मैन्युअल रूप से संदर्भित करने से वास्तव में समस्या हल हो जाती है।हालांकि: _ "टाइपस्क्रिप्ट स्वचालित रूप से अनुमान नहीं लगाता है कि आपकी फाइलों को किस क्रम में संयोजित किया जाना चाहिए" _ - क्या यह आसानी से संभव नहीं होना चाहिए? खैर, परिपत्र संदर्भों को छोड़कर, लेकिन अन्यथा मुझे कोई कारण नहीं दिखता कि यह नहीं किया जा सका। –

+1

@ जोहान व्हाइट एक दार्शनिक प्रश्न के रूप में प्रतीत होता है: https://github.com/Microsoft/TypeScript/issues/1066 – Alex

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