शुभ संध्या।संकलित आउटपुट में टाइपस्क्रिप्ट निर्भरता सही क्रम में हल नहीं होती है
मेरे पास एक प्रतीत होता है - बकवास समस्या टाइपस्क्रिप्ट प्रोजेक्ट से संकलित जावास्क्रिप्ट आउटपुट में उत्पन्न होती है। मुद्दा जटिल लगता है, लेकिन मैं इसे छोटा और सीधा बनाने की कोशिश करूंगा।
मेरी टाइपस्क्रिप्ट परियोजना "मायएप" (पूरी तरह से ऑब्जेक्ट उन्मुख, जिसे विजुअल स्टूडियो 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
को प्रभावित कक्षा के नामों को संकलन के दौरान अपने पूर्ण योग्य नामों के साथ प्रतिस्थापित करना चाहिए, और आउटपुट जावास्क्रिप्ट कोड में अतिरिक्त निर्देशों को लागू नहीं करना चाहिए।
धन्यवाद, फ़ाइल को मैन्युअल रूप से संदर्भित करने से वास्तव में समस्या हल हो जाती है।हालांकि: _ "टाइपस्क्रिप्ट स्वचालित रूप से अनुमान नहीं लगाता है कि आपकी फाइलों को किस क्रम में संयोजित किया जाना चाहिए" _ - क्या यह आसानी से संभव नहीं होना चाहिए? खैर, परिपत्र संदर्भों को छोड़कर, लेकिन अन्यथा मुझे कोई कारण नहीं दिखता कि यह नहीं किया जा सका। –
@ जोहान व्हाइट एक दार्शनिक प्रश्न के रूप में प्रतीत होता है: https://github.com/Microsoft/TypeScript/issues/1066 – Alex