क्लास और इंटरफेस को सार्वजनिक करने के लिए टाइपस्क्रिप्ट कीवर्ड "निर्यात" का उपयोग क्यों करता है?


136

टाइपस्क्रिप्ट के साथ डबिंग करते समय मुझे एहसास हुआ कि मॉड्यूल के भीतर मेरी कक्षाएं (नामस्थान के रूप में प्रयुक्त) अन्य वर्गों के लिए उपलब्ध नहीं थीं जब तक कि मैंने exportउनके सामने कीवर्ड नहीं लिखा , जैसे:

module some.namespace.here
{
   export class SomeClass{..}
}

तो अब मैं इस तरह उपरोक्त कोड का उपयोग कर सकते हैं:

var someVar = new some.namespace.here.SomeClass();

हालाँकि मैं सोच रहा था कि इस कीवर्ड का उपयोग केवल उस publicकीवर्ड का उपयोग करने के विरोध में किया जाता है जो विधि स्तर पर उपयोग किया जाता है यह दर्शाता है कि एक विधि या संपत्ति बाहरी रूप से सुलभ होनी चाहिए। तो क्यों न केवल बाहरी और दृश्यमान वर्गों और इंटरफेस बनाने के लिए इसी तंत्र का उपयोग किया जाए?

यह परिणामी कोड देगा जैसे:

module some.namespace.here
{
   public class SomeClass{..}
}

जवाबों:


177

प्राथमिक कारण यह है कि exportECMAScript की योजनाओं से मेल खाता है। आप यह तर्क दे सकते हैं कि "" उन्हें "सार्वजनिक" के बजाय "निर्यात" का उपयोग करना चाहिए था, लेकिन पहुँच संशोधक के खराब मिलान वाले सेट से "निर्यात / निजी / संरक्षित" होने के अनुसार, मेरा मानना ​​है कि दोनों के बीच एक सूक्ष्म अंतर है जो इसे समझाता है ।

टाइपस्क्रिप्ट में, उत्पन्न जावास्क्रिप्ट पर वर्ग सदस्य को चिह्नित करने publicया privateइसका कोई प्रभाव नहीं पड़ता है। यह केवल एक डिज़ाइन / संकलन समय उपकरण है जिसका उपयोग आप अपने टाइपस्क्रिप्ट कोड को रोकने के लिए कर सकते हैं।

exportकीवर्ड के साथ , जावास्क्रिप्ट मॉड्यूल में निर्यात की गई वस्तु को जोड़ने के लिए एक रेखा जोड़ता है। अपने उदाहरण में: here.SomeClass = SomeClass;

इसलिए वैचारिक रूप से, दृश्यता नियंत्रित होती है publicऔर privateसिर्फ टूलिंग के लिए होती है, जबकि exportकीवर्ड आउटपुट को बदल देता है।


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

इसके लिए धन्यवाद। मुझे बाल खींच के बचाता है।
केंट एगुइलर

1
यदि आप मॉड्यूल का उपयोग कर रहे हैं तो यह आवश्यक है। यदि आप ऐप बड़े पक्ष की ओर हैं, तो आमतौर पर बड़े बंडल बनाने / आपकी सभी फ़ाइलों को सामने लोड करने की तुलना में मॉड्यूल बेहतर विकल्प हैं।
फेंटन

@ फ़ेंटन का मतलब यह नहीं था "आप तर्क दे सकते हैं कि उन्हें 'एक्सपोर्ट' के बजाय 'पब्लिक' का इस्तेमाल करना चाहिए था?
एलन इवेंजलिस्ता

@AlanEvangelista आप निश्चित रूप से इसे उस तरह से गोल कर सकते हैं, खासकर अगर आपकी पृष्ठभूमि जावास्क्रिप्ट के बजाय जावा / सी # थी।
फेंटन

49

स्टीव फेंटन के जवाब में जोड़ने के लिए कुछ बातें:

  • export पहले से ही दो अलग-अलग चीजों का मतलब है (यह शीर्ष स्तर पर है या नहीं) के आधार पर; यह मतलब है कि एक तिहाई जोड़ने से शायद बदतर है public/private
  • यह निश्चित रूप से कार्यान्वयन को आसान बनाने के लिए नहीं है; publicबनाम की जटिल जटिलता exportतुच्छ है। हमने पहले से ही एक गुच्छा के चारों ओर खोजशब्द बदल दिए हैं; यह कठिन नहीं है।
  • कक्षा सदस्यों की डिफ़ॉल्ट दृश्यता को ES6 वर्ग प्रस्ताव के साथ संरेखित करने के लिए सार्वजनिक होना चाहिए, इसलिए हमें "सार्वजनिक नहीं" इंगित करने के लिए कुछ कीवर्ड की आवश्यकता है। वहाँ एक उपयुक्त antonym नहीं है export( unexport??), तो privateतार्किक विकल्प है। आपके पास एक बार private, यह publicअपने समकक्ष के रूप में नहीं चुनने के लिए कुछ पागल होगा
  • exportआंतरिक मॉड्यूल में दृश्यता को संशोधित करने का उपयोग ES6 मॉड्यूल के साथ सबसे अच्छा अनुमान संरेखण है

1
अतिरिक्त जानकारी के लिए धन्यवाद, मैं सदस्य स्तर पर सार्वजनिक / निजी से पूरी तरह सहमत हूं, मैंने पाया कि सभी स्तरों तक पहुँच के लिए पर्याप्त नहीं होना अजीब है। हालाँकि यह एक व्यक्तिगत राय है और एक कीवर्ड एक कीवर्ड है, बस और अधिक जानकारी प्राप्त करना चाहता था।
ग्रोफिट

5
मैं कार्यान्वयन में आसानी के बारे में अपने चुटीले बयान को फिर से प्रस्तुत करता हूं और माफी के रूप में एक +1 की पेशकश करता हूं :)
फेंटन

2
आप जो कुछ भी कह रहे हैं उससे मैं सहमत हूं, लेकिन मैं इस कथन से असहमत हूं कि "निर्यात करने के लिए उपयुक्त antonym नहीं है" - "आयात" antonym है, और टाइपस्क्रिप्ट का उपयोग करता है, जब आप एक निर्यात योग्य वर्ग को परिभाषित करते हैं, तब आप इसे अन्य फ़ाइलों में आयात करें। export class User { name: string } एक अन्य फ़ाइल: import {User} from ""./the_file_path_to_the_user_class; यहां nativescript
एडम

3
import"यह मान निर्यात नहीं किया गया है " इंगित करने के लिए कैसे उपयोग करना कीवर्ड का उपयुक्त उपयोग होगा?
रयान कैवानुआघ

5
"निर्यात करने के लिए एक उपयुक्त antonym नहीं है (unexport ??)" - निर्यात के लिए एक उपयुक्त antonym embargo होना चाहिए।
आरपी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.