परिचय: Generics क्या हैं और ये क्यों महत्वपूर्ण हैं
\nTypeScript एक कड़ाई से टाइप की गई भाषा है, जो JavaScript में एक शक्तिशाली प्रकार प्रणाली जोड़ती है। हालाँकि, कड़ाई से टाइपिंग कभी-कभी लचीला और पुन: प्रयोज्य कोड लिखने में बाधा उत्पन्न करती है। यहीं पर Generics (जेनेरिक्स, सामान्यीकृत प्रकार) मददगार साबित होते हैं।
\nGenerics एक उपकरण है जो आपको ऐसे घटक (फ़ंक्शन, क्लासेज, इंटरफ़ेस) बनाने की अनुमति देता है जो विभिन्न प्रकार के डेटा के साथ काम करते हैं, बिना प्रकारों पर नियंत्रण खोए। कल्पना करें कि आप एक फ़ंक्शन लिख रहे हैं जिसे संख्याओं, स्ट्रिंग्स और ऐरे के साथ काम करना है। जेनेरिक्स के बिना, आपको या तो any का उपयोग करना होगा (जो टाइपिंग के सभी लाभों को समाप्त कर देता है) या प्रत्येक डेटा प्रकार के लिए अलग-अलग फ़ंक्शन बनाने होंगे। Generics इस समस्या को सुरुचिपूर्ण और सुरक्षित रूप से हल करते हैं।
इस लेख में, हम समझेंगे कि TypeScript में जेनेरिक्स क्यों ज़रूरी हैं, और सबसे महत्वपूर्ण बात, व्यवहार में उनका उपयोग कैसे करें - सरल फ़ंक्शन से लेकर जटिल क्लासेज और प्रकार प्रतिबंधों तक।
\n\nमुख्य भाग
\n\n1. फ़ंक्शन में Generics: सिद्धांत से व्यवहार तक
\nजेनेरिक्स का सबसे सरल और सामान्य उदाहरण वे फ़ंक्शन हैं जो एक ही प्रकार का डेटा प्राप्त करते हैं और लौटाते हैं। आइए एक क्लासिक समस्या पर विचार करें: एक फ़ंक्शन जो किसी ऐरे का पहला तत्व लौटाता है।
\n\nखराब तरीका (Generics के बिना):
\n// any के साथ उदाहरण — प्रकार की जानकारी खो जाती है\nfunction getFirst(arr: any[]): any {\n return arr[0];\n}\n\nconst num = getFirst([1, 2, 3]); // num का प्रकार any है, हम नहीं जानते कि यह संख्या है\n\nसही तरीका (Generics के साथ):
\n// सामान्यीकृत प्रकार T का उपयोग करें\nfunction getFirst<T>(arr: T[]): T {\n return arr[0];\n}\n\nconst num = getFirst([1, 2, 3]); // num का प्रकार number है\nconst str = getFirst(['a', 'b', 'c']); // str का प्रकार string है\nconst bool = getFirst([true, false]); // bool का प्रकार boolean है\n\nयह कैसे काम करता है? हम एक प्रकार पैरामीटर <T> घोषित करते हैं (नाम कुछ भी हो सकता है, लेकिन परंपरा के अनुसार T, U, V का उपयोग किया जाता है)। TypeScript पारित तर्क के आधार पर स्वचालित रूप से विशिष्ट प्रकार का अनुमान लगाता है। इसे प्रकार अनुमान कहा जाता है।
आप फ़ंक्शन को कॉल करते समय स्पष्ट रूप से प्रकार भी निर्दिष्ट कर सकते हैं:
\nconst num = getFirst<number>([1, 2, 3]); // स्पष्ट प्रकार निर्दिष्ट करना\n\nएक और उपयोगी उदाहरण एक फ़ंक्शन है जो ऐरे का एक यादृच्छिक तत्व लौटाता है:
\nfunction getRandom<T>(items: T[]): T {\n const randomIndex = Math.floor(Math.random() * items.length);\n return items[randomIndex];\n}\n\nconst randomNumber = getRandom([10, 20, 30]); // प्रकार — number\nconst randomName = getRandom(['अन्ना', 'इवान', 'मारिया']); // प्रकार — string\n\n2. इंटरफ़ेस और प्रकारों में Generics
\nजेनेरिक्स इंटरफ़ेस के साथ भी बढ़िया काम करते हैं। यह लचीली डेटा संरचनाएँ बनाने की अनुमति देता है जो विभिन्न प्रकार के मानों को संग्रहीत कर सकती हैं।
\n\nकल्पना करें कि हम एक API प्रतिक्रिया का वर्णन करना चाहते हैं जिसमें किसी भी प्रकार का डेटा हो सकता है:
\ninterface ApiResponse<T> {\n status: number;\n message: string;\n data: T;\n}\n\n// विभिन्न डेटा प्रकारों के लिए उपयोग\nconst userResponse: ApiResponse<{ id: number; name: string }> = {\n status: 200,\n message: 'सफल',\n data: { id: 1, name: 'अलेक्सेई' }\n};\n\nconst listResponse: ApiResponse<string[]> = {\n status: 200,\n message: 'सूची प्राप्त हुई',\n data: ['सेब', 'केला', 'संतरा']\n};\n\nआप प्रकार उपनामों (type) के साथ भी जेनेरिक्स का उपयोग कर सकते हैं:
type Result<T> = {\n success: boolean;\n value: T;\n error?: string;\n};\n\nconst successResult: Result<number> = { success: true, value: 42 };\nconst errorResult: Result<string> = { success: false, error: 'लोड करने में त्रुटि', value: '' };\n\nध्यान दें: हम कर सकते हैं को