TypeScript में वैकल्पिक पैरामीटर छोड़कर दूसरे पास करना सीखें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

TypeScript में छूटे पैरामीटर की समस्या

\n

क्या आपने कभी दस वैकल्पिक पैरामीटर वाला फंक्शन लिखा और फिर सिर्फ पाँचवाँ और दसवाँ पैरामीटर पास करना चाहा? और तुरंत कंपाइलेशन एरर या उससे भी बुरी, एक चुपके से लॉजिकल गलती मिली? परिचित लग रहा है?

\n

Stack Overflow पर इस सवाल के हज़ारों व्यूज़ हैं। TypeScript डेवलपर्स बार-बार एक ही समस्या में फँसते हैं: एक वैकल्पिक पैरामीटर को कैसे पास करें जबकि दूसरे को छोड़ दें? आखिरकार, स्टैंडर्ड सिंटैक्स ऐसा करने नहीं देता – पैरामीटर नाम से नहीं, बल्कि पोज़ीशन से पास होते हैं।

\n

आज हम इस समस्या को हमेशा के लिए सुलझा लेंगे। मैं आपको 4 काम करने वाले तरीके दिखाऊँगा: साधारण रिफैक्टरिंग से लेकर partial-ऑब्जेक्ट वाली एडवांस तकनीकों तक। चलिए शुरू करते हैं!

\n\n

यह समस्या क्यों है? पोज़ीशन का श्राप

\n

TypeScript (और JavaScript) में फंक्शन के पैरामीटर क्रम से पास होते हैं। अगर आपके पास यह फंक्शन है:

\n
function 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\n

तरीका 1: पैरामीटर ऑब्जेक्ट (सबसे सही)

\n

यह गंभीर प्रोजेक्ट्स में सुझाया गया पैटर्न है। कई पोज़ीशनल पैरामीटर के बजाय, एक ऑब्जेक्ट का उपयोग करें जिसमें वैकल्पिक फ़ील्ड हों:

\n
interface 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
\n

यह तरीका 90% वैकल्पिक पैरामीटर समस्याओं को हल करता है। लेकिन अगर आप लीगेसी कोड पर काम कर रहे हैं या API नहीं बदल सकते – आगे पढ़ें।

\n\n

तरीका 2: फंक्शन ओवरलोडिंग

\n

TypeScript आपको एक फंक्शन के लिए कई सिग्नेचर घोषित करने देता है। यह तब उपयोगी है जब आपके पास पैरामीटर के खास कॉम्बिनेशन हों:

\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 के साथ टपल का उपयोग करें:

ब्लॉग

पुस्तक अनुशंसाएँ