TypeScript और इसका शाश्वत प्रश्न: प्रकार को nullable कैसे बनाएं?
\n\nनमस्ते, सहकर्मी! यदि आपने कभी TypeScript में लिखा है, तो आप निश्चित रूप से ऐसी स्थिति में आए होंगे जहाँ फ़ंक्शन मान लौटा सकता है, या नहीं भी लौटा सकता है। या कोई वेरिएबल तुरंत इनिशियलाइज़ नहीं होता है। और यहाँ एक महत्वपूर्ण प्रश्न उठता है: ऐसे प्रकार की घोषणा कैसे करें जो null या undefined हो सकता है?
यह प्रश्न Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (दसियों हज़ार बार देखा गया!), और यह व्यर्थ नहीं है। TypeScript सख्त है, लेकिन निष्पक्ष है। यह हमें string प्रकार के वेरिएबल में आसानी से null असाइन नहीं करने देता। और यह बहुत अच्छा है, क्योंकि यह हमें कई बगों से बचाता है। लेकिन क्या होगा जब nullable व्यावसायिक तर्क का हिस्सा हो? आइए समझते हैं।
इस लेख में, हम केवल एक सूखा उत्तर नहीं देंगे। हम बुनियादी से लेकर उन्नत तकनीकों तक जाएंगे, सामान्य गलतियों पर चर्चा करेंगे और जानेंगे कि ऐसा कोड कैसे लिखें जो सुरक्षित और सुरुचिपूर्ण हो। चलिए शुरू करते हैं!
\n\nमूल बातें: Union Types और Null
\n\nप्रकार को nullable बनाने का सबसे सरल और सीधा तरीका union type (प्रकारों का संघ) का उपयोग करना है। यदि कोई वेरिएबल स्ट्रिंग या null हो सकता है, तो हम इसे इस प्रकार लिखते हैं:
\n\nlet userName: string | null = null;\nuserName = "अलीशा"; // ठीक है\nuserName = null; // यह भी ठीक है\n\n\nयही बात undefined के साथ भी काम करती है। TypeScript में null और undefined अलग-अलग प्रकार हैं (जब तक कि --strictNullChecks फ़्लैग चालू न हो, लेकिन उसके बारे में थोड़ी देर बाद)।
let age: number | undefined;\nage = 25;\nage = undefined; // काम करता है\n\n\nमहत्वपूर्ण: यदि आप | null या | undefined का उपयोग करते हैं, तो TypeScript आपको उपयोग करने से पहले मान की जाँच करने के लिए बाध्य करेगा। संभावित null ऑब्जेक्ट पर विधि को कॉल करने का प्रयास करने पर कंपाइलेशन त्रुटि होगी। यह वही "सुरक्षा" है जिसके लिए हम TS से प्यार करते हैं।
वास्तविक जीवन का उदाहरण: उपयोगकर्ता खोजना
\n\ninterface User {\n id: number;\n name: string;\n}\n\nfunction findUser(id: number): User | null {\n // ...खोज तर्क\n if (id === 1) {\n return { id: 1, name: "इवान" };\n }\n return null;\n}\n\nconst user = findUser(2);\n// user.name; // त्रुटि! 'user' संभवतः null है\nif (user) {\n console.log(user.name); // अब सुरक्षित है\n}\n\n\nदेखा? कंपाइलर स्वयं आपको संकेत देता है: "अरे, जाँच करो, नहीं तो तुम गिर जाओगे!"। इससे डिबगिंग के घंटे बचते हैं।
\n\nवैकल्पिक पैरामीटर और गुण (Optional Chaining)
\n\nअक्सर, न केवल वेरिएबल, बल्कि ऑब्जेक्ट के फ़ील्ड या फ़ंक्शन के तर्क भी nullable होते हैं। इसके लिए TypeScript में एक विशेष सिंटैक्स है — optional modifier (प्रश्न चिह्न ?)।
फ़ंक्शन के वैकल्पिक पैरामीटर
\n\nfunction greet(name?: string) {\n if (name) {\n return `नमस्ते, ${name}!`;\n }\n return "नमस्ते, अजनबी!";\n}\n\nconsole.log(greet("पीटर")); // नमस्ते, पीटर!\nconsole.log(greet()); // नमस्ते, अजनबी!\n\n\nपैरामीटर name का प्रकार स्वचालित रूप से string | undefined हो जाता है। ध्यान दें: यदि पैरामीटर वैकल्पिक है, तो आप इसे पास नहीं कर सकते हैं, और TS कोई आपत्ति नहीं करेगा।
इंटरफ़ेस के वैकल्पिक गुण
\n\ninterface Config {\n url: string;\n port?: number; // number या undefined हो सकता है\n}\n\nconst config1: Config = { url: "http://localhost" }; // port अनुपस्थित है\nconst config2: Config = { url: "http://localhost", port: 3000 };\n\n\nconfig1.port तक पहुँचने पर, TypeScript कहेगा कि यह number | undefined है। और यह सही है — हम नहीं जानते कि पोर्ट सेट है या नहीं।
वैकल्पिक श्रृंखला (Optional Chaining) — आपका सबसे अच्छा दोस्त
\n\nES2020 और TypeScript 3.7 के आगमन के साथ, हमारे पास नेस्टेड गुणों तक सुरक्षित रूप से पहुँचने का एक सुरुचिपूर्ण तरीका है जो null या undefined हो सकते हैं। इसे optional chaining कहा जाता है।