interface
तब होता है जब आप किसी ऑब्जेक्ट के आकार का वर्णन करना चाहते हैं। इंटरफेस के लिए, कभी भी कोड जनरेशन नहीं है - वे पूरी तरह से टाइप सिस्टम में एक आर्टिफैक्ट हैं। आपको implements
क्लॉज के आधार पर कक्षा के लिए कोड जनरेशन में कोई अंतर नहीं दिखाई देगा।
declare class
जब आप एक मौजूदा वर्ग का वर्णन करना चाहते के लिए है (आमतौर पर एक टाइपप्रति वर्ग, लेकिन हमेशा नहीं) है कि बाहर से उपस्थित होने जा रहा है (उदाहरण के लिए, आप दो .ts फ़ाइलों को दो .js को संकलित किया है फ़ाइलों और दोनों को वेबपृष्ठ में script
टैग के माध्यम से शामिल किया गया है)। यदि आप class
से extends
का उपयोग करते हैं (भले ही बेस प्रकार declare class
या नियमित class
) है, तो संकलक प्रोटोटाइप श्रृंखला को हुक करने और रचनाकारों को अग्रेषित करने के लिए सभी कोड उत्पन्न करने जा रहा है और क्या नहीं।
यदि आप declare class
से प्राप्त करने का प्रयास करते हैं जो एक इंटरफ़ेस होना चाहिए, तो आपके पास रनटाइम त्रुटि होगी क्योंकि वह जेनरेट कोड किसी ऑब्जेक्ट का संदर्भ नहीं देगा जिसमें कोई रनटाइम अभिव्यक्ति नहीं है।
इसके विपरीत, यदि आप implement
एक इंटरफ़ेस जो declare class
होना चाहिए, तो आपको अपने सभी सदस्यों को फिर से कार्यान्वित करना होगा और इच्छानुसार किसी भी कोड पुन: उपयोग का लाभ नहीं उठाएगा। बेस क्लास बनें, और रनटाइम पर प्रोटोटाइप चेन की जांच करने वाले फ़ंक्शंस आपके ऑब्जेक्ट को अस्वीकार कर देंगे क्योंकि वास्तव में बेस क्लास का उदाहरण नहीं है।
वास्तव में nerdy प्राप्त करने के लिए, यदि आप एक सी ++ पृष्ठभूमि है, आप मोटे तौर पर एक निर्माता है कि सख्ती से इस संकलन इकाई में एक परिभाषा का अभाव का एक extern
घोषणा के रूप में interface
रूप typedef
और declare class
के बारे में सोच सकते हैं।
एक शुद्ध खपत की ओर से (अनिवार्य कोड लिखने, नए प्रकार जोड़ने नहीं), interface
और declare class
के बीच फर्क सिर्फ इतना है कि आप नहीं कर सकते हैं new
एक इंटरफेस। हालांकि, यदि आप extend
/implement
का एक नया class
में इन प्रकारों में से एक का इरादा रखते हैं, तो आपको बिल्कुल interface
और declare class
के बीच सही ढंग से चुना होगा। उनमें से केवल एक काम करेगा।
दो नियम है कि आप अच्छी तरह से काम करेगा:
- एक निर्माता समारोह (
new
के साथ कुछ invokable) के साथ प्रकार से संरेखित करने का नाम है कि वास्तव में कार्यावधि में मौजूद है (उदाहरण के लिए Date
है, लेकिन JQueryStatic
नहीं है) ? यदि कोई है, तो आप निश्चित रूप से interface
- क्या मैं किसी अन्य टाइपस्क्रिप्ट फ़ाइल से संकलित कक्षा से निपट रहा हूं, या कुछ समान समान है? यदि हाँ, का उपयोग
declare class
स्रोत
2013-01-15 22:27:16
देखें http://stackoverflow.com/a/14323673/1704166 –
मुझे नहीं लगता कि इनमें से कोई भी वास्तव में वर्णन करने में मदद करता है कि आप एक दूसरे का उपयोग करेंगे क्योंकि वे दोनों एक ही जेएस आउटपुट के साथ एक ही चीज़ को पूरा कर सकते हैं। – Chris