मॉड्यूल पाठ (2/2)
मौलिक जेनेरिक
जेनरिक (जेनेरिक प्रोग्रामिंग) टाइपस्क्रिप्ट की सबसे शक्तिशाली विशेषताओं में से एक है। वे आपको लचीले, पुन: प्रयोज्य घटकों, कार्यों और इंटरफेस को लिखने की अनुमति देते हैं जो अधिकतम प्रकार की सुरक्षा बनाए रखते हुए और any के उपयोग से बचते हुए विभिन्न डेटा प्रकारों के साथ काम कर सकते हैं।
सामान्य कार्य
जेनेरिक को प्रकारों के लिए एक वेरिएबल के रूप में सोचें। आइए एक ऐसे फ़ंक्शन पर विचार करें जो इसे दिए गए मान को एक तर्क के रूप में लौटाता है:
function identity<T>(arg: T): T {
return arg;
}अक्षर T (Type का संक्षिप्त रूप) प्रकार के लिए प्लेसहोल्डर है। जब हम identity को कॉल करते हैं, तो टाइपस्क्रिप्ट पारित तर्क के प्रकार को कैप्चर करता है और स्वचालित रूप से T को उस प्रकार पर सेट करता है:
const str = identity<string>('Hello'); // T is string
const num = identity(42); // T is number (automatically inferred!)जेनेरिक इंटरफेस और उपनाम
जेनेरिक कंटेनर या डेटा संरचनाओं को परिभाषित करने के लिए जेनेरिक को इंटरफेस और प्रकार के उपनामों पर भी लागू किया जा सकता है:
interface Box<T> {
content: T;
}
const stringBox: Box<string> = { content: 'TypeScript' };
const numberBox: Box<number> = { content: 42 };एकाधिक प्रकार के पैरामीटर
हम ऐसे फ़ंक्शंस या प्रकारों को परिभाषित कर सकते हैं जो एकाधिक प्रकार के चर का उपयोग करते हैं (उदाहरण के लिए, T और U):
function mergeObjects<T, U>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}सामान्य बाधाएँ
कभी-कभी हम किसी जेनेरिक द्वारा स्वीकृत प्रकारों को सीमित करना चाहते हैं। हम बाधा जोड़ने के लिए extends कीवर्ड का उपयोग कर सकते हैं।
उदाहरण के लिए, यदि हम चाहते हैं कि सामान्य प्रकार में हमेशा एक length गुण हो (जैसे स्ट्रिंग या सरणियाँ):
interface HasLength {
length: number;
}
function logLength<T extends HasLength>(arg: T): void {
console.log(arg.length); // Safe! We know arg has 'length'
}
logLength('Hello'); // Valid
logLength([1, 2, 3]); // Valid
// logLength(42); // Error: number does not have a length property!खुद कोशिश करना
अभ्यास 1: सामान्य पहचान फ़ंक्शन
सामान्य पहचान फ़ंक्शन को पूरा करें ताकि यह सामान्य प्रकार टी के मान पैरामीटर को स्वीकार कर सके और इसे बिना किसी संशोधन के लौटा सके।
संकेत दिखाएँ
रिटर्न प्रकार पैरामीटर के समान सामान्य प्रकार T होना चाहिए।
3 प्रयासों के बाद समाधान उपलब्ध है
व्यायाम 2: जेनेरिक बॉक्स रैपर
बॉक्स नामक एक सामान्य इंटरफ़ेस को परिभाषित करें जो एक प्रकार के पैरामीटर टी को स्वीकार करता है और इसमें प्रकार टी की सामग्री नामक एक एकल संपत्ति होती है।
संकेत दिखाएँ
इंटरफ़ेस Box<T> {content: T; का उपयोग करें; } वाक्यविन्यास.
3 प्रयासों के बाद समाधान उपलब्ध है
व्यायाम 3: सामान्य बाधा
getLength नामक एक सामान्य फ़ंक्शन लिखें जो एक पैरामीटर arg स्वीकार करता है। arg को एक ऐसे इंटरफ़ेस तक सीमित किया जाना चाहिए जिसमें लंबाई गुण (संख्या) हो। फ़ंक्शन को arg.length लौटाना होगा।
संकेत दिखाएँ
फ़ंक्शन को getLength<T एक्सटेंड्स hasLength>(arg: T): संख्या के रूप में घोषित करें और arg.length लौटाएं।
3 प्रयासों के बाद समाधान उपलब्ध है
व्यायाम 4: सामान्य जोड़ी
दो गुणों के साथ एक सामान्य इंटरफ़ेस Pair<T, U> को परिभाषित करें: पहला T प्रकार का और दूसरा U प्रकार का। इसके बाद, एक सामान्य फ़ंक्शन makePair बनाएं जो पहले (T प्रकार का) और दूसरा (U प्रकार का) स्वीकार करता है और Pair<T, U> को लागू करने वाला एक ऑब्जेक्ट लौटाता है।
संकेत दिखाएँ
दो सामान्य पैरामीटर Pair<T, U> के लिए सिंटैक्स का उपयोग करें और तदनुसार makePair को परिभाषित करें।
3 प्रयासों के बाद समाधान उपलब्ध है