टाइपप्रति में आंतरिक और बाह्य मॉड्यूल के बीच क्या अंतर है?

वोट
40

मैं कुछ समय बिताया टाइपप्रति भाषा विनिर्देश पढ़ रहे हैं और कुछ हद तक बीच अंतर के बारे उलझन में हूँ है आंतरिक और बाहरी मॉड्यूल। यहाँ वर्णन विनिर्देश से सीधे लिया है:

आंतरिक मॉड्यूल (खंड 9.2.2) (वैश्विक मॉड्यूल और बाहरी मॉड्यूल सहित) अन्य मॉड्यूल के स्थानीय या निर्यात के सदस्य हैं। आंतरिक मॉड्यूल ModuleDeclarations अपने नाम और शरीर निर्दिष्ट करते हैं कि का उपयोग करते हुए घोषणा की जाती है। एक से अधिक पहचानकर्ता के साथ एक नाम पथ नेस्टेड आंतरिक मॉड्यूल घोषणाओं की एक श्रृंखला के बराबर है।

बाहरी मॉड्यूल (खंड 9.4) अलग से बाहरी मॉड्यूल नाम का उपयोग संदर्भित कोड के शव लोड किए गए हैं। एक बाहरी मॉड्यूल एक अलग स्रोत फ़ाइल है कि कम से कम एक आयात या निर्यात घोषणा-पत्र शामिल के रूप में लिखा है। इसके अलावा, बाहरी मॉड्यूल वैश्विक मॉड्यूल कि सीधे स्ट्रिंग शाब्दिक रूप में बाहरी मॉड्यूल नाम निर्दिष्ट में AmbientModuleDeclarations का उपयोग कर की घोषणा की जा सकती है। इस अनुभाग में 0 में आगे बताया गया है।

मैं क्या समझ लिया है से मुझे लगता है कि बाहरी मॉड्यूल मॉड्यूल परिभाषाओं कि बस प्रकार और / या चर का एक सेट निर्यात संलग्न बिना फ़ाइलों टाइपप्रति के अनुरूप हैं। एक और टाइपप्रति फ़ाइल से मैं साधारण आयात में एक बाहरी मॉड्यूल कर सकते हैं foo.ts साथimport foo = module(foo);

किसी ने मुझसे करने के लिए बाह्य और आंतरिक मॉड्यूल के बीच destinction व्याख्या कर सकते हैं?

11/10/2012 को 15:10
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
27

धारा 9.3 और विनिर्देश के 9.4 अधिक स्पष्ट रूप से यह समझाने। मैं यहाँ उन वर्गों में दिए गए उदाहरण में से कुछ पुन: पेश करेंगे।

बाहरी मॉड्यूल

मान लीजिए निम्नलिखित कोड में है main.ts

import log = module("log");
log.message("hello");

इस फ़ाइल में एक बाहरी मॉड्यूल का संदर्भ log, जो कुछ भी द्वारा परिभाषित log.tsनिर्यात।

export function message(s: string) { 
  console.log(s); 
}

सूचना है कि log.tsउपयोग नहीं करता है moduleकीवर्ड कहीं भी। यह सिर्फ के साथ चीजों को निर्यात करता है export

आंतरिक मॉड्यूल

इस फ़ाइल में दो आंतरिक मॉड्यूल है, X.Y.Z

module A.B.C { 
  import XYZ = X.Y.Z; 
  export function ping(x: number) { 
    if (x > 0) XYZ.pong(x – 1); 
  }
} 
module X.Y.Z { 
  import ABC = A.B.C; 
  export function pong(x: number) { 
    if (x > 0) ABC.ping(x – 1); 
  } 
}

ये व्यवहार (अधिकतर) बाहरी मॉड्यूल की तरह, लेकिन वे एक फ़ाइल में निहित हैं और आप किसी भी बाहर फ़ाइलों को संदर्भित करने के लिए उन्हें इस्तेमाल करने की जरूरत नहीं है। वे एक के अंदर निहित होने की जरूरत moduleब्लॉक जब वे परिभाषित कर रहे हैं।

11/10/2012 को 15:33
का स्रोत उपयोगकर्ता

वोट
6

ऐन्डर्स प्रस्तुतियों के अनुसार: http://channel9.msdn.com/posts/Anders-Hejlsberg-Introducing-TypeScript (34:40) और टाइपप्रति प्रलेखन, बाहरी मॉड्यूल मॉड्यूल जो शीर्ष एएमडी (अतुल्यकालिक मॉडल परिभाषा) या के आधार पर कर रहे हैं CommonJS।

बाहरी मॉड्यूल वे मॉड्यूल परिभाषाओं की आंतरिक बयान छिपाने के लिए और केवल तरीकों और घोषित चर से जुड़े मानकों को दिखाने के अर्थ में उपयोगी होते हैं।

मान लीजिए आप एक है Mainएक परिभाषित के साथ कक्षा logएक में रखा विधि transfer.jsफ़ाइल। के आंतरिक तरीकों Mainवर्ग ही दिखाई जब आप आयात कर रहे हैं कर रहे हैं transfer.jsके रूप में तो स्रोत js फ़ाइल के शीर्ष पर फ़ाइल: ///<reference path="transfer.js"/>। इस तरह संकलक कार्यावधि में सभी js फ़ाइलों के ट्रेवर्सल दूर करता है।

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

11/10/2012 को 15:49
का स्रोत उपयोगकर्ता

वोट
1

आंतरिक मॉड्यूल:

  1. आप अपने typescritp फ़ाइलों के भीतर मॉड्यूल परिभाषित कर सकते हैं।
  2. सभी चर मॉड्यूल के भीतर परिभाषित मॉड्यूल के दायरे वाला और वैश्विक क्षेत्र से हटा दिया जाता है।
  3. जब आप संकलन अपने टाइपप्रति फ़ाइलें अपने मॉड्यूल चर कि घोंसला के रूप में आवश्यक नाम स्थान की तरह वस्तुओं के लिए फार्म में बदला जाता है। ध्यान दें कि वर्ग मॉड्यूल के भीतर परिभाषित बड़े करीने से एक Iife (तुरंत लागू समारोह अभिव्यक्ति) का उपयोग अलग है।
  4. नीचे दिए गए कोड से पता चलता है कि MyClass चर MyInternalModule मॉड्यूल के दायरे वाला। वे मॉड्यूल इसलिए कोड की अंतिम पंक्ति से पता चलता त्रुटि नाम MyClass नहीं मिल सकता है के बाहर पहुँचा नहीं जा सकता।
  5. आप निर्यात कीवर्ड का उपयोग मॉड्यूल के बाहर चर पहुँच सकते हैं।
  6. तुम भी आंतरिक मॉड्यूल विस्तार कर सकते हैं, फ़ाइलों में उन्हें साझा, और ट्रिपल स्लेश सिंटैक्स का उपयोग संदर्भित नहीं करते। (///)

उदाहरण :

module MyInternalModule{  
    class MyClass{               //if We write export keyword before the MyClass then last line works fine
        constructor (
            public height: number, 
            public width: number) {
    }
    }                   
    //working properly
    var obj1 = new MyClass(10, 4);
}

// it wont work //Because the out of the scope
var obj2 = new MyInternalModule.MyClass(10,4) //shows error: can not find name MyClass

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

var MyInternalModule;
(function (MyInternalModule) {
    var MyClass = (function () {
        function MyClass(height, width) {
            this.height = height;
            this.width = width;
        }
        return MyClass;
    })();
    //working properly
    var obj1 = new MyClass(10, 4);
})(MyInternalModule || (MyInternalModule = {}));

बाहरी मॉड्यूल:

उदाहरण :

// bootstrapper.ts file

// imports the greeter.ts file as the greeter module
import gt = module('greeter');  
export function run() {  
    var el = document.getElementById('content');
    var greeter = new gt.Greeter(el);
    greeter.start(); 
}

// greeter.ts file

// exports the entire module
export class Greeter {  
    start() {
         this.timerToken = setInterval(() => 
             this.span.innerText = 
             new Date().toUTCString(), 500);
    }
}
29/09/2016 को 07:35
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more