2013-05-09 7 views
6

मैं एक page-a.ts के साथ आयात मॉड्यूल जो page-a.js में संकलित होगा:टाइपप्रति: केवल बयान

alert('this is from page-a'); 

और मैं एक main.ts जो main.js में संकलित है:

import pageA = module('page-a') 
alert('this is from main'); 

और ये मेरे tsc आदेश है रेखा:

tsc --module amd page-a.ts main.ts 

और मैं requirejs उपयोग कर रहा हूँ इस तरह:

<script src="require.js" data-main="main.js"></script> 

मैं नहीं जब पेज लोड हो रहा है page-a से चेतावनी messagebox देख सकते हैं। और उत्पन्न स्क्रिप्ट main.js में, page-a के बारे में कुछ भी नहीं है।

मेरा सवाल है, यह क्यों हो रहा है? और मैं टाइपस्क्रिप्ट को ऐसे मॉड्यूल को आयात करने के लिए कैसे मजबूर करूं जो स्पष्ट रूप से कोड द्वारा उपयोग नहीं किया जाता है?

+0

मैंने इस जवाब को स्वीकार कर लिया है क्योंकि यह मेरे प्रश्न का सही उत्तर है। लेकिन मैंने अपनी समस्या को हल करने के लिए एक और दृष्टिकोण का उपयोग किया है, जिसे आप यहां देख सकते हैं: https://typescript.codeplex.com/discussions/443144 – deerchao

उत्तर

3

आपके जेनरेट किए गए जेएस मॉड्यूल को आयात नहीं करेंगे जो स्पष्ट रूप से कोड में उपयोग नहीं किया जाता है। टाइपस्क्रिप्ट उस तरह चालाक है और किसी मॉड्यूल के लिए जेएस उत्पन्न नहीं करेगा जो केवल आयात और उपयोग नहीं किया जाता है।

आप की जरूरत है:

  • दूसरे मॉड्यूल में पहली मॉड्यूल में निर्यात एक चर और
  • आयात पहले मॉड्यूल और दूसरे मॉड्यूल में निर्यात चर
  • उपयोग

तो पेज-ए.जे.एस. जैसे कुछ है:

export var x = 123; // just to export something that you can use 
alert('this is from page-a'); 

और के रूप में main.ts:

import pageA = module('page-a') 
var foo = pageA.x; // If you remove this line and you will not get the alert from page-a 
alert('this is from main'); 
+0

धन्यवाद, आपका चाल काम करता है। मैं कुछ समय इंतजार करूँगा यह देखने के लिए कि उत्तर स्वीकार करने से पहले कोई बेहतर समाधान है या नहीं। – deerchao

+1

यह चालबाजी नहीं है :) requjs परिभाषित ("],() => {}) ब्लॉक में संलग्न मॉड्यूल की आवश्यकता है। –

+0

TypeSript केवल तभी उत्पन्न होगा जब फ़ाइल में निर्यात करने के लिए smth है। –

11

वहाँ @basarat ने उल्लेख किया एक के अलावा दो अन्य तरीकों से यह सुनिश्चित करें कि आयातित मॉड्यूल समारोह को परिभाषित करने और इस प्रकार लोड में शामिल है।

अपनी टाइपस्क्रिप्ट फ़ाइल के शीर्ष पर amd-निर्भरता तत्व शामिल करें।

///<amd-dependency path="pathToFileRelativeToBaseWithoutFileExtension"/> 

या

import moduleName = require("pathToFileRelativeToBaseWithoutFileExtension"); 
moduleName; //Does not require declaring a new variable. 

पूर्व शायद दुष्प्रभाव होने के कम से कम मौका एक है। दुर्भाग्यवश, तत्व और इसका उपयोग अच्छी तरह से प्रलेखित नहीं है।

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

वे कहते हैं कि यह डिज़ाइन (https://typescript.codeplex.com/workitem/2436) है लेकिन मैं सम्मान से असहमत हूं।यदि मैंने मॉड्यूल/फ़ाइल आयात की है और मेरे पास उस मॉड्यूल में एक ठोस प्रकार का संदर्भ है, तो उस मॉड्यूल को उस बिंदु पर लोड करने के लिए लोड किया जाना चाहिए। अतिरिक्त कदम करने के लिए अनावश्यक है।

0

मुझे पता है कि मैं देर से कर रहा हूँ, लेकिन यहाँ एक और तरीका है इस लक्ष्य को हासिल करने के लिए है: हालांकि इस ES6 वाक्य रचना टाइपप्रति बदलना होगा
import "path/to/external/module";
:
आप का उपयोग करके बस साइड इफेक्ट के लिए एक मॉड्यूल आयात करने के लिए टाइपप्रति बता सकते हैं एएमडी में यह आवश्यक है() जब आप पास करते हैं - मॉड्यूल टीएससी के लिए एमडी और चूंकि इसे केवल साइड इफेक्ट्स के लिए आयात किया जाता है, तो इसे गिराया नहीं जाएगा।