TypeScript में छूटे पैरामीटर की समस्या
\nक्या आपने कभी दस वैकल्पिक पैरामीटर वाला फंक्शन लिखा और फिर सिर्फ पाँचवाँ और दसवाँ पैरामीटर पास करना चाहा? और तुरंत कंपाइलेशन एरर या उससे भी बुरी, एक चुपके से लॉजिकल गलती मिली? परिचित लग रहा है?
\nStack Overflow पर इस सवाल के हज़ारों व्यूज़ हैं। TypeScript डेवलपर्स बार-बार एक ही समस्या में फँसते हैं: एक वैकल्पिक पैरामीटर को कैसे पास करें जबकि दूसरे को छोड़ दें? आखिरकार, स्टैंडर्ड सिंटैक्स ऐसा करने नहीं देता – पैरामीटर नाम से नहीं, बल्कि पोज़ीशन से पास होते हैं।
\nआज हम इस समस्या को हमेशा के लिए सुलझा लेंगे। मैं आपको 4 काम करने वाले तरीके दिखाऊँगा: साधारण रिफैक्टरिंग से लेकर partial-ऑब्जेक्ट वाली एडवांस तकनीकों तक। चलिए शुरू करते हैं!
\n\nयह समस्या क्यों है? पोज़ीशन का श्राप
\nTypeScript (और JavaScript) में फंक्शन के पैरामीटर क्रम से पास होते हैं। अगर आपके पास यह फंक्शन है:
\nfunction createUser(\n name: string,\n age?: number,\n email?: string,\n isAdmin?: boolean\n) { /* ... */ }\nआप इसे ऐसे कॉल नहीं कर सकते: createUser('Rahul', , 'rahul@mail.com')। पैरामीटर छोड़ने से एक खाली जगह बनती है जिसे TypeScript स्वीकार नहीं करेगा। आपको undefined या null पास करना होगा, जो कोड और लॉजिक को गंदा करता है।
लेकिन अच्छी खबर यह है: हम इस सीमा को कई सुंदर तरीकों से पार कर सकते हैं। आइए हर एक को समझते हैं।
\n\nतरीका 1: पैरामीटर ऑब्जेक्ट (सबसे सही)
\nयह गंभीर प्रोजेक्ट्स में सुझाया गया पैटर्न है। कई पोज़ीशनल पैरामीटर के बजाय, एक ऑब्जेक्ट का उपयोग करें जिसमें वैकल्पिक फ़ील्ड हों:
\ninterface UserOptions {\n name: string;\n age?: number;\n email?: string;\n isAdmin?: boolean;\n}\n\nfunction createUser(options: UserOptions): void {\n const { name, age, email, isAdmin } = options;\n console.log(`उपयोगकर्ता ${name} बनाया गया, आयु: ${age ?? 'नहीं दी गई'}`);\n}\n\n// अब सिर्फ ज़रूरी चीज़ें पास करें!\ncreateUser({ name: 'अन्ना', email: 'anna@mail.com' });\ncreateUser({ name: 'पीटर', isAdmin: true });\n\nफ़ायदे स्पष्ट हैं:
\n- \n
- इससे कोई फर्क नहीं पड़ता कि कितने पैरामीटर हैं – सिर्फ वही पास करें जो चाहिए \n
- कोड स्वयं-व्याख्यात्मक है: तुरंत पता चलता है कि क्या किसके लिए जिम्मेदार है \n
- सिग्नेचर बदले बिना नए फ़ील्ड जोड़ना आसान है \n
यह तरीका 90% वैकल्पिक पैरामीटर समस्याओं को हल करता है। लेकिन अगर आप लीगेसी कोड पर काम कर रहे हैं या API नहीं बदल सकते – आगे पढ़ें।
\n\nतरीका 2: फंक्शन ओवरलोडिंग
\nTypeScript आपको एक फंक्शन के लिए कई सिग्नेचर घोषित करने देता है। यह तब उपयोगी है जब आपके पास पैरामीटर के खास कॉम्बिनेशन हों:
\n// ओवरलोड घोषित करें\nfunction getData(url: string): Promise<any>;\nfunction getData(url: string, timeout: number): Promise<any>;\nfunction getData(url: string, timeout: number, retries: number): Promise<any>;\n\n// इम्प्लीमेंटेशन (सबसे सामान्य होना चाहिए)\nfunction getData(\n url: string,\n timeout?: number,\n retries?: number\n): Promise<any> {\n // लॉजिक\n return fetch(url, { signal: AbortSignal.timeout(timeout ?? 5000) });\n}\n\n// अब इसे ऐसे कॉल कर सकते हैं:\ngetData('/api/users'); // timeout = 5000 (डिफ़ॉल्ट)\ngetData('/api/users', 3000); // timeout = 3000\n// लेकिन ऐसे नहीं (बिना ओवरलोड के timeout छोड़ना मुमकिन नहीं):\n// getData('/api/users', undefined, 2); // बुरा\n\nनुकसान: ओवरलोडिंग बीच के पैरामीटर छोड़ने की समस्या हल नहीं करती। यह सिर्फ सख्त कॉम्बिनेशन देती है। लचीलेपन के लिए पहला तरीका बेहतर है।
\n\nतरीका 3: Rest पैरामीटर + डिस्ट्रक्चरिंग (अनोखा)
\nअगर आप पोज़ीशनल सिस्टम बनाए रखना चाहते हैं लेकिन लचीलापन चाहिए, तो rest के साथ टपल का उपयोग करें: