JavaScript में Generics: क्यों ज़रूरी हैं और कैसे उपयोग करें
JavaScript और Node.js पर आधुनिक डेवलपमेंट की दुनिया में, Generics (जेनेरिक्स, या सामान्यीकृत प्रकार) की अवधारणा तेज़ी से आम होती जा रही है। हालाँकि मूल JavaScript सख्त टाइपिंग का समर्थन नहीं करता, TypeScript और JSDoc जैसे उपकरण सामान्यीकृत प्रोग्रामिंग के शक्तिशाली तंत्र को लागू करने की अनुमति देते हैं। इस लेख में, हम समझेंगे कि Generics की आवश्यकता क्यों है, वे Node.js के संदर्भ में कैसे काम करते हैं, और उनका सही उपयोग कैसे करें।
Generics क्या है और इसकी आवश्यकता क्यों है?
Generics एक ऐसा तंत्र है जो आपको ऐसे घटक (फंक्शन, क्लास, इंटरफ़ेस) बनाने की अनुमति देता है जो विभिन्न डेटा प्रकारों के साथ काम करते हैं, जबकि सख्त टाइपिंग बनाए रखते हैं। संख्याओं, स्ट्रिंग्स और ऐरे के लिए एक ही फंक्शन को बार-बार लिखने के बजाय, आप एक सामान्यीकृत कोड लिखते हैं।
Generics के मुख्य लाभ:
- टाइप सुरक्षा — टाइप की त्रुटियाँ रनटाइम के बजाय कम्पाइलेशन/जाँच के चरण में ही पकड़ी जाती हैं।
- कोड का पुन: उपयोग — एक ही फंक्शन किसी भी डेटा प्रकार के साथ काम करता है।
- पठनीयता — कोड स्व-दस्तावेजीकरण बन जाता है।
- IDE के साथ एकीकरण — ऑटो-कम्प्लीशन और टाइप सुझाव सही ढंग से काम करते हैं।
Node.js में, Generics डेटाबेस, API अनुरोधों, डेटा संग्रह और उपयोगिताओं के साथ काम करते समय विशेष रूप से उपयोगी होते हैं।
TypeScript में Generics (मुख्य तरीका)
TypeScript, JavaScript के ऊपर एक परत है जो स्थैतिक टाइपिंग जोड़ता है। TypeScript में ही Generics सबसे अधिक पूर्ण रूप से लागू किए गए हैं। आइए मूल सिंटैक्स देखें।
सरल सामान्यीकृत फंक्शन
// Generics के बिना — any का उपयोग करना पड़ता हैfunction identity(arg: any): any { return arg;}
// Generics के साथ — प्रकार सुरक्षित रहता हैfunction identity<T>(arg: T): T { return arg;}
// उपयोगconst num = identity<number>(42); // प्रकार numberconst str = identity<string>("hello"); // प्रकार stringकोण कोष्ठक <T> प्रकार पैरामीटर की घोषणा है। T एक सशर्त नाम है, यह कुछ भी हो सकता है (अक्सर T, U, V का उपयोग किया जाता है)।
Arrays के साथ Generics
सबसे सामान्य मामलों में से एक है arrays के साथ काम करना:
// फंक्शन जो array का पहला तत्व लौटाता हैfunction getFirst<T>(arr: T[]): T | undefined { return arr[0];}
const firstNumber = getFirst([1, 2, 3]); // numberconst firstString = getFirst(["a", "b", "c"]); // stringएकाधिक प्रकार
आप कई प्रकार के पैरामीटर का उपयोग कर सकते हैं:
function pair<T, U>(first: T, second: U): [T, U] { return [first, second];}
const result = pair(42, "उत्तर"); // प्रकार [number, string]Generics में प्रतिबंध (Constraints)
कभी-कभी यह सीमित करना आवश्यक होता है कि किन प्रकारों का उपयोग किया जा सकता है। इसके लिए extends कीवर्ड के साथ प्रतिबंध (constraints) का उपयोग किया जाता है।
// फंक्शन जो केवल उन ऑब्जेक्ट्स के साथ काम करता है जिनमें length प्रॉपर्टी हैfunction getLength<T extends { length: number }>(arg: T): number { return arg.length;}
getLength("hello"); // 5 — स्ट्रिंग में length होता हैgetLength([1, 2, 3]); // 3 — array में length होता है// getLength(42); // त्रुटि! number में length नहीं होतायह Node.js में बफ़र्स, स्ट्रिंग्स और arrays के साथ काम करते समय विशेष रूप से उपयोगी है — उन सभी में length प्रॉपर्टी होती है।
क्लासेस और इंटरफ़ेसेस में Generics
Generics न केवल फंक्शन के साथ, बल्कि क्लासेस और इंटरफ़ेसेस के साथ भी बहुत अच्छा काम करते हैं।
सामान्यीकृत क्लास
Node.js पर एक सरल स्टैक का उदाहरण:
class Stack<T> { private items: T[] = [];
push(item: T): void { this.items.push(item); }
pop(): T | undefined { return this.items.pop
```