विस्तारित - कुछ टिप्पणियों के आधार पर अधिक विवरण प्रदान करने के लिए
त्रुटि
TS2306 त्रुटि: फ़ाइल 'test.ts' एक मॉड्यूल नहीं है।
यहाँ वर्णित तथ्य से आता है http://exploringjs.com/es6/ch_modules.html
17. मॉड्यूल
यह अध्याय बताता है कि ECMAScript 6 में अंतर्निहित मॉड्यूल कैसे काम करते हैं।
17.1 अवलोकन
ECMAScript 6 में, मॉड्यूल फाइलों में संग्रहीत होते हैं। प्रति फ़ाइल एक मॉड्यूल और प्रति मॉड्यूल एक फ़ाइल है। आपके पास मॉड्यूल से चीजों को निर्यात करने के दो तरीके हैं। इन दो तरीकों को मिश्रित किया जा सकता है, लेकिन आमतौर पर उन्हें अलग से उपयोग करना बेहतर होता है।
17.1.1 एकाधिक नामित निर्यात
कई नामित निर्यात हो सकते हैं:
//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
return x * x;
}
export function diag(x, y) {
return sqrt(square(x) + square(y));
}
...
17.1.2 एकल डिफ़ॉल्ट निर्यात
एकल डिफ़ॉल्ट निर्यात हो सकता है। उदाहरण के लिए, एक समारोह:
//------ myFunc.js ------
export default function () { ··· } // no semicolon!
उपरोक्त के आधार पर हमें test.js फ़ाइल के export
एक भाग के रूप में , की आवश्यकता है । आइए इस की सामग्री को इस तरह समायोजित करें:
// test.js - exporting es6
export module App {
export class SomeClass {
getName(): string {
return 'name';
}
}
export class OtherClass {
getName(): string {
return 'name';
}
}
}
और अब हम इसे इन तरीकों से आयात कर सकते हैं:
import * as app1 from "./test";
import app2 = require("./test");
import {App} from "./test";
और हम इस तरह आयातित सामान का उपभोग कर सकते हैं:
var a1: app1.App.SomeClass = new app1.App.SomeClass();
var a2: app1.App.OtherClass = new app1.App.OtherClass();
var b1: app2.App.SomeClass = new app2.App.SomeClass();
var b2: app2.App.OtherClass = new app2.App.OtherClass();
var c1: App.SomeClass = new App.SomeClass();
var c2: App.OtherClass = new App.OtherClass();
और इसे कार्रवाई में देखने के लिए विधि को कॉल करें:
console.log(a1.getName())
console.log(a2.getName())
console.log(b1.getName())
console.log(b2.getName())
console.log(c1.getName())
console.log(c2.getName())
मूल भाग नेमस्पेस के उपयोग में जटिलता की मात्रा को कम करने में मदद करने की कोशिश कर रहा है
मूल भाग:
मैं वास्तव में दृढ़ता से इस प्रश्नोत्तर की जाँच करने का सुझाव दूंगा:
मुझे पहले वाक्य का हवाला देते हैं:
बाहरी मॉड्यूल में "नामस्थान" का उपयोग न करें।
यह मत करो।
गंभीरता से। रूक जा।
...
इस मामले में, हमें केवल module
अंदर की आवश्यकता नहीं है test.ts
। यह समायोजित की गई सामग्री हो सकती है test.ts
:
export class SomeClass
{
getName(): string
{
return 'name';
}
}
यहाँ और पढ़ें
पिछले उदाहरण में, जब हमने प्रत्येक सत्यापनकर्ता का उपभोग किया, तो प्रत्येक मॉड्यूल ने केवल एक मूल्य का निर्यात किया। इस तरह के मामलों में, इन प्रतीकों के साथ उनके योग्य नाम के माध्यम से काम करना बोझिल होता है जब एक एकल पहचानकर्ता ऐसा ही करेगा।
export =
वाक्य रचना को निर्दिष्ट करता है एक वस्तु है कि मॉड्यूल से निर्यात किया जाता है । यह एक वर्ग, इंटरफ़ेस, मॉड्यूल, फ़ंक्शन, या एनम हो सकता है। जब आयात किया जाता है, तो निर्यात किए गए प्रतीक को सीधे उपभोग किया जाता है और किसी भी नाम से योग्य नहीं होता है।
हम बाद में इसे इस तरह से उपभोग कर सकते हैं:
import App = require('./test');
var sc: App.SomeClass = new App.SomeClass();
sc.getName();
यहाँ और पढ़ें:
कुछ मामलों में, आप केवल कुछ शर्तों के तहत एक मॉड्यूल लोड करना चाह सकते हैं। टाइपस्क्रिप्ट में, हम इस प्रकार और अन्य उन्नत लोडिंग परिदृश्यों को लागू करने के लिए नीचे दिखाए गए पैटर्न का उपयोग कर सकते हैं, सीधे टाइपिंग सुरक्षा को खोने के बिना मॉड्यूल लोडर को लागू करने के लिए।
संकलक पता लगाता है कि क्या प्रत्येक मॉड्यूल उत्सर्जित जावास्क्रिप्ट में उपयोग किया जाता है। उन मॉड्यूलों के लिए जिन्हें केवल टाइप सिस्टम के हिस्से के रूप में उपयोग किया जाता है, किसी भी कॉल की आवश्यकता नहीं होती है। अप्रयुक्त संदर्भों का यह पुलिंग एक अच्छा प्रदर्शन अनुकूलन है, और उन मॉड्यूल के वैकल्पिक लोडिंग के लिए भी अनुमति देता है।
पैटर्न का मुख्य विचार यह है कि आयात आईडी = आवश्यकता ('...') विवरण हमें बाहरी मॉड्यूल द्वारा उजागर किए गए प्रकारों तक पहुंच प्रदान करता है। मॉड्यूल लोडर को गतिशील रूप से (आवश्यकता के माध्यम से) लागू किया जाता है, जैसा कि नीचे के ब्लॉक में दिखाया गया है। यह रेफरेंस-कुलिंग ऑप्टिमाइज़ेशन का लाभ उठाता है ताकि मॉड्यूल केवल जरूरत पड़ने पर ही लोड हो। काम करने के लिए इस पैटर्न के लिए, यह महत्वपूर्ण है कि आयात के माध्यम से परिभाषित प्रतीक का उपयोग केवल प्रकार के पदों में किया जाता है (अर्थात कभी भी ऐसी स्थिति में जिसे जावास्क्रिप्ट में उत्सर्जित नहीं किया जाएगा)।