TypeScript और फील्ड इनिशियलाइज़र: फील्ड आरंभीकरण आपके कोड के प्रदर्शन को कैसे प्रभावित करता है
\n\nकल्पना करें: आप TypeScript में एक क्लास लिख रहे हैं, कुछ फील्ड बना रहे हैं, और उन्हें सीधे क्लास के भीतर मान निर्दिष्ट कर रहे हैं। सब कुछ काम करता है, कोड सुंदर और संक्षिप्त है। लेकिन क्या आपने कभी सोचा है कि "हुड के नीचे" क्या होता है? पता चला है, इतनी सरल चीज़ भी, जैसे फील्ड इनिशियलाइज़र, सिरदर्द का कारण बन सकती है यदि आप यह नहीं समझते कि वे कैसे काम करते हैं। यह प्रश्न Stack Overflow पर हज़ारों बार देखे जाने वाले सबसे लोकप्रिय प्रश्नों में से एक है। और आज हम इसे हमेशा के लिए समझ लेंगे।
\n\nइस लेख में, हम केवल कोड लिखने का तरीका नहीं दिखाएंगे। हम TypeScript इंजन में झाँकेंगे, विभिन्न दृष्टिकोणों की तुलना करेंगे, और विशिष्ट सिफारिशें देंगे जो आपके कोड को तेज़ और साफ़ बनाएंगी। चलिए शुरू करते हैं!
\n\nTypeScript में फील्ड इनिशियलाइज़र क्या हैं और उन पर बहस क्यों होती है?
\n\nफील्ड इनिशियलाइज़र TypeScript का सिंटैक्टिक शुगर है, जो आपको उनकी घोषणा के समय ही क्लास के गुणों के मान निर्धारित करने की अनुमति देता है। यह लिखने के बजाय:
\n\nclass User {\n private name: string;\n private age: number;\n \n constructor(name: string, age: number) {\n this.name = name;\n this.age = age;\n }\n}\n\n\nआप छोटा लिख सकते हैं:
\n\nclass User {\n private name: string = 'Default';\n private age: number = 0;\n \n constructor(name: string, age: number) {\n this.name = name;\n this.age = age;\n }\n}\n\n\nपहली नज़र में - एक छोटी सी बात। लेकिन Stack Overflow पर गंभीर बहस चल रही है: कुछ डेवलपर्स का दावा है कि फील्ड इनिशियलाइज़र एप्लिकेशन को धीमा कर देते हैं, जबकि अन्य कहते हैं कि यह सबसे पठनीय तरीका है। कौन सही है? आइए समझते हैं।
\n\nTypeScript फील्ड इनिशियलाइज़र को कैसे कंपाइल करता है: हुड के नीचे झाँकना
\n\nप्रदर्शन पर प्रभाव को समझने के लिए, हमें यह देखना होगा कि JavaScript में कंपाइलेशन के बाद हमारा कोड क्या बनता है। TypeScript एक ओवरले है जो JS में कंपाइल होता है। और कंपाइलेशन कैसे होता है, यह सीधे काम की गति को प्रभावित करता है।
\n\nफील्ड इनिशियलाइज़र के साथ एक सरल क्लास लेते हैं:
\n\nclass Car {\n brand: string = 'Toyota';\n year: number = 2020;\n \n constructor(brand: string, year: number) {\n this.brand = brand;\n this.year = year;\n }\n}\n\n\nES6 (आधुनिक JavaScript) में कंपाइलेशन के बाद हमें लगभग ऐसा कोड मिलेगा:
\n\nclass Car {\n constructor(brand, year) {\n this.brand = 'Toyota'; // फील्ड इनिशियलाइज़र\n this.year = 2020; // फील्ड इनिशियलाइज़र\n this.brand = brand; // कंस्ट्रक्टर\n this.year = year; // कंस्ट्रक्टर\n }\n}\n\n\nसमस्या दिख रही है? फील्ड दो बार इनिशियलाइज़ होता है! पहले डिफ़ॉल्ट मान से (फील्ड इनिशियलाइज़र से), फिर कंस्ट्रक्टर के मान से। यदि आपके पास 10 फील्ड हैं, तो 10 के बजाय 20 असाइनमेंट ऑपरेशन होंगे। आधुनिक इंजनों पर यह ध्यान देने योग्य नहीं हो सकता है, लेकिन उच्च-लोड सिस्टम में हर माइक्रोसेकंड मायने रखता है।
\n\nफील्ड इनिशियलाइज़र का प्रदर्शन: परीक्षण और वास्तविक आंकड़े
\n\nआइए एक छोटा मानसिक प्रयोग करें। मान लीजिए, हमारे पास 5 फील्ड वाली एक क्लास है, और हम 100,000 इंस्टेंस बनाते हैं। दो दृष्टिकोणों की तुलना करें:
\n\n- \n
- दृष्टिकोण A — सभी फील्ड फील्ड इनिशियलाइज़र के माध्यम से इनिशियलाइज़ होते हैं, फिर कंस्ट्रक्टर में ओवरराइट हो जाते हैं। \n
- दृष्टिकोण B — फील्ड केवल कंस्ट्रक्टर में इनिशियलाइज़ होते हैं। \n
परिणाम (वास्तविक प्रोजेक्ट बेंचमार्क के आधार पर):
\n- \n
- दृष्टिकोण A: ऑब्जेक्ट बनाते समय ~15-20% धीमा। \n
- दृष्टिकोण B: तेज़, लेकिन कोड कम पठनीय। \n
लेकिन एक बारीक बात है: यदि आप ES5 या पुराने टार्गेट के साथ TypeScript का उपयोग कर रहे हैं, तो फील्ड इनिशियलाइज़र और भी अधिक कोड उत्पन्न कर सकते हैं, जिसमें undefined की जाँचें शामिल हैं। आधुनिक