परिचय: यह समस्या इतनी कॉमन क्यों है?
\n\nहर डेवलपर जो JavaScript से TypeScript पर आता है या इस भाषा में कोड लिखता है, उसे कभी न कभी इस समस्या का सामना करना पड़ता है: फंक्शन में पास किए गए ऑब्जेक्ट के लिए डिफ़ॉल्ट मान कैसे सेट करें? Stack Overflow पर इस सवाल के हज़ारों व्यूज़ और दर्जनों जवाब हैं। क्यों? क्योंकि यह आसान लगने वाला काम — "अगर ऑब्जेक्ट नहीं दिया गया तो खाली ऑब्जेक्ट use करो" — TypeScript में टाइप्स, इंटरफ़ेसेस और डिस्ट्रक्चरिंग के साथ एक चुनौती बन जाता है।
\n\nइस आर्टिकल में हम सभी संभावित तरीकों को कवर करेंगे, सबसे सरल से लेकर एडवांस्ड तक, कोड उदाहरणों और समझाने के साथ। आप सीखेंगे कि TypeScript ऑब्जेक्ट आर्गुमेंट के लिए डिफ़ॉल्ट मान कैसे सेट करें और आम गलतियों से कैसे बचें। चलिए शुरू करते हैं!
\n\nसमस्या: सामान्य तरीके में क्या गड़बड़ है?
\n\nमान लीजिए हमारे पास एक फंक्शन है जो सेटिंग्स का ऑब्जेक्ट लेता है:
\n\nfunction createUser(config: { name?: string; age?: number }) {\n // ...\n}\n\ncreateUser(); // Error! आर्गुमेंट चाहिए\n\n\nJavaScript में हम आसानी से function createUser(config = {}) लिख सकते थे और काम खत्म। लेकिन TypeScript में यह ट्रिक काम नहीं करेगी: कंपाइलर टाइप मिसमैच की शिकायत करेगा। क्यों? क्योंकि खाली ऑब्जेक्ट {} इंटरफ़ेस { name?: string; age?: number } से मेल नहीं खाता — इसमें ये प्रॉपर्टीज़ ही नहीं हैं।
और यहीं से असली मज़ा शुरू होता है। आइए सभी समाधानों को समझते हैं।
\n\nतरीका 1: डिस्ट्रक्चरिंग के साथ डिफ़ॉल्ट मान असाइन करना
\n\nसबसे सुंदर और लोकप्रिय तरीका — फंक्शन पैरामीटर में ही डिस्ट्रक्चरिंग का उपयोग करें। आप ऑब्जेक्ट के प्रॉपर्टीज़ निकालते हैं और उन्हें तुरंत डिफ़ॉल्ट मान देते हैं:
\n\nfunction createUser({ name = "अतिथि", age = 18 }: { name?: string; age?: number } = {}) {\n console.log(`उपयोगकर्ता बनाया गया: ${name}, आयु: ${age}`);\n}\n\ncreateUser(); // "उपयोगकर्ता बनाया गया: अतिथि, आयु: 18"\ncreateUser({ name: "अन्ना" }); // "उपयोगकर्ता बनाया गया: अन्ना, आयु: 18"\ncreateUser({ age: 25 }); // "उपयोगकर्ता बनाया गया: अतिथि, आयु: 25"\n\n\nअंत में = {} पर ध्यान दें। यह खुद ऑब्जेक्ट के लिए डिफ़ॉल्ट मान है। अगर आप कोई आर्गुमेंट नहीं देते, TypeScript खाली ऑब्जेक्ट use करता है, और डिस्ट्रक्चरिंग हर प्रॉपर्टी के लिए डिफ़ॉल्ट मान सेट कर देती है।
फायदे: साफ, संक्षिप्त, बिल्कुल सही काम करता है।
\nनुकसान: हर प्रॉपर्टी के लिए टाइप स्पष्ट रूप से बताना पड़ता है।
तरीका 2: Partial के साथ इंटरफ़ेस का उपयोग
\n\nअगर आपका ऑब्जेक्ट बड़ा है, तो पैरामीटर में सभी टाइप्स बताना अच्छा नहीं लगता। इंटरफ़ेस को अलग से निकालें और Partial<T> का उपयोग करें:
interface UserConfig {\n name: string;\n age: number;\n email: string;\n isAdmin: boolean;\n}\n\nfunction createUser(config: Partial<UserConfig> = {}) {\n const defaults: UserConfig = {\n name: "अतिथि",\n age: 18,\n email: "noemail@example.com",\n isAdmin: false\n };\n \n const mergedConfig = { ...defaults, ...config };\n console.log(mergedConfig);\n}\n\ncreateUser({ name: "राहुल" });\n// { name: "राहुल", age: 18, email: "noemail@example.com", isAdmin: false }\n\n\nयहाँ Partial<UserConfig> सभी प्रॉपर्टीज़ को ऑप्शनल बना देता है। फंक्शन के अंदर हम डिफ़ॉल्ट मानों को पास किए गए मानों के साथ मर्ज करते हैं। यह बढ़िया काम करता है, लेकिन मैन्युअल मर्जिंग की ज़रूरत है।
तरीका 3: चेक के साथ क्लासिक तरीका
\n\nकभी-कभी ज़्यादा कंट्रोल चाहिए। उदाहरण के लिए, अगर आप केवल undefined के लिए डिफ़ॉल्ट मान सेट करना चाहते हैं, null के लिए नहीं। पुराने अच्छे if का उपयोग करें:
function createUser(config?: UserConfig) {\n const name = config?.name ?? "अतिथि";\n const age = config?.age ?? 18;\n const email = config?.email ?? "noemail@example.com";\n \n console.log({ name, age, email });\n}\n\ncreateUser();