क्या TypeScript में प्रकारों का विस्तार किया जा सकता है? प्रदर्शन और अनुकूलन में गहराई से उतरना
\n\nनमस्ते दोस्त! यदि आपने कभी TypeScript में लिखा है, तो आपने निश्चित रूप से इस प्रश्न का सामना किया होगा: "क्या प्रकारों को इंटरफेस की तरह ही विस्तारित किया जा सकता है?" यह प्रश्न Stack Overflow पर हजारों बार देखा गया है, और यह व्यर्थ नहीं है। ऐसा लगता है कि सब कुछ सरल है: इंटरफेस extends के माध्यम से विस्तारित होते हैं, और प्रकार प्रतिच्छेदन (&) के माध्यम से। लेकिन इसमें बारीकियाँ हैं, और वे सीधे प्रदर्शन और कोड की पठनीयता को प्रभावित करती हैं।
आज हम समझेंगे कि TypeScript में प्रकारों का विस्तार कैसे करें, यह इंटरफेस से कैसे अलग है, और अनुकूलन करते समय गलतियाँ कैसे न करें। चलिए शुरू करते हैं!
\n\nType बनाम Interface: शाश्वत लड़ाई
\n\nविस्तार के बारे में बात करने से पहले, आइए अंतर याद करें। इंटरफेस "अनुबंध" हैं जिन्हें कई बार घोषित किया जा सकता है (घोषणात्मक विलय), जबकि प्रकार किसी भी रूप के लिए उपनाम (alias) हैं। दोनों को विस्तारित किया जा सकता है, लेकिन अलग-अलग तरीकों से।
\n\nइंटरफेस का विस्तार कैसे करें?
\nयहाँ सब कुछ परिचित है:
\ninterface Animal {\n name: string;\n}\n\ninterface Bear extends Animal {\n honey: boolean;\n}\n\nconst bear: Bear = { name: 'Winnie', honey: true };\n\nसरल, सुरुचिपूर्ण, काम करता है। लेकिन क्या होगा अगर हम प्रकार के लिए भी ऐसा ही चाहते हैं?
\n\nप्रकारों का विस्तार कैसे करें?
\nप्रकार सीधे extends का समर्थन नहीं करते हैं। इसके बजाय, प्रतिच्छेदन ऑपरेटर (&) का उपयोग किया जाता है:
type Animal = {\n name: string;\n};\n\ntype Bear = Animal & { honey: boolean };\n\nconst bear: Bear = { name: 'Winnie', honey: true };\n\nयह समान दिखता है, लेकिन इसमें छिपी समस्याएँ हैं। आइए उदाहरणों के साथ उन्हें समझते हैं।
\n\nप्रदर्शन: क्या तेज़ है?
\n\nकरोड़ों का सवाल: क्या interface extends या type & का चुनाव संकलन और निष्पादन की गति को प्रभावित करता है? स्पॉयलर: हाँ, लेकिन उतना नहीं जितना आप सोचते हैं।
संकलन: इंटरफेस जीतते हैं
\nTypeScript इंटरफेस को प्रकारों के प्रतिच्छेदन की तुलना में तेज़ी से संकलित करता है। क्यों? इंटरफेस "सपाट" संरचनाएँ हैं जिन्हें संकलक कैश कर सकता है और रैखिक रूप से संसाधित कर सकता है। प्रकारों का प्रतिच्छेदन जटिल निर्माण हैं जिनके लिए पुनरावर्ती विस्तार की आवश्यकता हो सकती है।
\n\n// इंटरफेस - तेज़\ninterface A { a: string }\ninterface B extends A { b: number }\n\n// प्रकार - धीमा\ntype A = { a: string }\ntype B = A & { b: number }\n\nसैकड़ों प्रकारों वाली बड़ी परियोजनाओं में, अंतर ध्यान देने योग्य हो सकता है। लेकिन यदि आपके पास 10-20 संस्थाएँ हैं, तो आप इसे महसूस नहीं करेंगे।
\n\nनिष्पादन: कोई अंतर नहीं
\nTypeScript JavaScript के ऊपर एक आवरण है। रनटाइम में न तो इंटरफेस होते हैं और न ही प्रकार। वे केवल विकास के चरण में मौजूद होते हैं। इसलिए, प्रोग्राम के निष्पादन की गति पर चुनाव का कोई प्रभाव नहीं पड़ता है।
\n\nप्रकार इंटरफेस से कब बेहतर होते हैं?
\nसंभावित धीमी संकलन के बावजूद, कुछ परिदृश्यों में प्रकार अपरिहार्य हैं:
\n- \n
- Union types — प्रकारों का संघ (जैसे,
string | number) \n - Conditional types — सशर्त प्रकार (जैसे,
T extends string ? 'yes' : 'no') \n - Mapped types — गुणों का रूपांतरण (जैसे,
{ [K in keyof T]: boolean }) \n
इंटरफेस इसे संभाल नहीं सकते। लेकिन यदि आपको केवल किसी ऑब्जेक्ट का विस्तार करना है — इंटरफेस सबसे अच्छे हैं।
\n\nअनुकूलन: अपने पैर में गोली कैसे न मारें
\n\nअब सबसे दिलचस्प भाग पर। विस्तार योग्य प्रकार कैसे लिखें ताकि संकलन धीमा न हो और सहकर्मी भ्रमित न हों?
\n\nनियम 1: ऑब्जेक्ट के लिए इंटरफेस, बाकी सबके लिए प्रकार का उपयोग करें
\nयह स्वर्ण मानक है। यदि आप किसी ऑब्जेक्ट के आकार का वर्णन कर रहे हैं — interface लें। यदि आपको union, intersection, या जेनेरिक के साथ जादू चाहिए — type लें।
// अच्छा\ninterface User {\n id: number;\n name: string;\n}\n\ntype Status = 'active' | 'inactive';\ntype Admin = User & { role: 'admin' };