मुख्य सामग्री पर जाएं
मॉड्यूल 2 · पाठ 2 का 2पाठ्यक्रम में 4/14~15 min
मॉड्यूल पाठ (2/2)

संघ और संकीर्णता

वास्तविक दुनिया में, चर और एपीआई प्रतिक्रियाओं का हमेशा एक निश्चित प्रकार नहीं होता है। टाइपस्क्रिप्ट परिवर्तनशीलता को संभालने के लिए यूनियन प्रकार प्रदान करता है, और रनटाइम पर उन पर सुरक्षित रूप से काम करने के लिए टाइप नैरोइंग प्रदान करता है।


संघ के प्रकार

एक यूनियन प्रकार एक वेरिएबल को विभिन्न प्रकार के मान स्वीकार करने की अनुमति देता है। इसे ऊर्ध्वाधर बार (|) प्रतीक का उपयोग करके व्यक्त किया जाता है:

TS
let result: number | string;
result = 42; // Valid
result = 'Error 404'; // Valid

हालाँकि, यूनियन प्रकार के साथ काम करते समय, हम सीधे उन तरीकों को कॉल नहीं कर सकते हैं जो केवल एक प्रकार से संबंधित हैं (उदाहरण के लिए, हम .toUpperCase() को कॉल नहीं कर सकते हैं यदि वेरिएबल number भी हो सकता है)। हमें पहले प्रकार को "संकीर्ण" करना होगा।


संकुचन टाइप करें

टाइप नैरोइंग वह प्रक्रिया है जहां टाइपस्क्रिप्ट रनटाइम पर एक वेरिएबल के लिए अधिक विशिष्ट प्रकार निकालने के लिए नियंत्रण प्रवाह संरचनाओं (जैसे if या switch) का विश्लेषण करता है।

संकुचन करने के कई तरीके हैं:

1. typeof ऑपरेटर

आदिम प्रकारों को अलग करने के लिए आदर्श:

TS
function printLength(value: string | number) {
  if (typeof value === 'string') {
    // TypeScript knows 'value' is a string here
    console.log(value.length);
  } else {
    // TypeScript knows 'value' is a number here
    console.log(value.toFixed(2));
  }
}

2. in ऑपरेटर

यह जांचने के लिए उपयोग किया जाता है कि किसी वस्तु पर कोई विशिष्ट संपत्ति मौजूद है या नहीं:

TS
interface Fish {
  swim: () => void;
}
interface Bird {
  fly: () => void;
}

function move(animal: Fish | Bird) {
  if ('swim' in animal) {
    animal.swim(); // Narrowing to Fish
  } else {
    animal.fly(); // Narrowing to Bird
  }
}

भेदभावपूर्ण यूनियनें

भेदभावपूर्ण संघ पैटर्न में ऐसी वस्तुएं बनाना शामिल है जो एक अद्वितीय शाब्दिक मूल्य (जिसे डिस्क्रिमिनेटर कहा जाता है) के साथ एक सामान्य संपत्ति साझा करते हैं। टाइपस्क्रिप्ट इस विभेदक को पहचानता है और स्वचालित रूप से सशर्त ब्लॉकों के भीतर प्रकार को सीमित कर देता है।

TS
interface SuccessResponse {
  status: 'success'; // Literal discriminator
  data: string;
}

interface ErrorResponse {
  status: 'error'; // Literal discriminator
  errorMessage: string;
}

type ApiResponse = SuccessResponse | ErrorResponse;

function handleResponse(response: ApiResponse) {
  if (response.status === 'success') {
    console.log('Data received:', response.data);
  } else {
    console.error('An error occurred:', response.errorMessage);
  }
}

खुद कोशिश करना

अभ्यास 1: संघ के प्रकार

व्यायाम#ts.m2.l2.e1
प्रयास: 0लोड हो रहा है...

आईडी नामक एक वेरिएबल घोषित करें जो या तो एक संख्या या एक स्ट्रिंग हो सकता है। पहले इसे 101 नंबर से आरंभ करें, फिर स्ट्रिंग मान 'USER-101' निर्दिष्ट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

| का प्रयोग करें लेट वैरिएबल घोषणा में संख्या और स्ट्रिंग को जोड़ने के लिए ऑपरेटर।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम 2: मूल प्रकार का संकुचन

व्यायाम#ts.m2.l2.e2
प्रयास: 0लोड हो रहा है...

प्रारूप इनपुट नामक एक फ़ंक्शन बनाएं जो स्ट्रिंग या संख्या प्रकार के पैरामीटर इनपुट को स्वीकार करता है। यदि इनपुट एक स्ट्रिंग है, तो रिटर्न इनपुट को अपरकेस में परिवर्तित करें। यदि यह एक संख्या है, तो इनपुट को 2 से गुणा करके लौटाएँ। प्रकार स्पष्ट रूप से निर्दिष्ट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

व्यवहार को शाखाबद्ध करने के लिए if ब्लॉक के अंदर typeof इनपुट === 'स्ट्रिंग' का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम 3: 'अंदर' के साथ संकुचन

व्यायाम#ts.m2.l2.e3
प्रयास: 0लोड हो रहा है...

दो इंटरफेस कार (मेथड ड्राइव के साथ) और बोट (मेथड सेल के साथ) को देखते हुए, मूवव्हीकल नामक एक फ़ंक्शन लिखें जो कार या बोट प्रकार के पैरामीटर वाहन को स्वीकार करता है। यदि वाहन में ड्राइव प्रॉपर्टी है, तो ड्राइव() विधि निष्पादित करें। अन्यथा, सेल() विधि निष्पादित करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

इंटरफ़ेस को संकीर्ण करने के लिए वाहन में 'ड्राइव' के रूप में इन ऑपरेटर का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम 4: विभेदित संघ आकार

व्यायाम#ts.m2.l2.e4
प्रयास: 0लोड हो रहा है...

एक प्रकार की आकृति को परिभाषित करें जो दो प्रकारों का मिलन है: वृत्त और वर्ग। सर्कल में एक प्रकार की संपत्ति 'सर्कल' (शाब्दिक मूल्य) और एक त्रिज्या (संख्या) पर सेट होती है। वर्ग में एक प्रकार का गुण 'वर्ग' (शाब्दिक मान) और एक पक्ष (संख्या) पर सेट होता है। फिर एक फ़ंक्शन getArea लिखें जो आकार प्रकार के आकार को स्वीकार करता है और क्षेत्र को एक संख्या के रूप में लौटाता है (सर्कल Math.PI * त्रिज्या * त्रिज्या के लिए, वर्ग पक्ष * पक्ष के लिए)।

संपादक लोड हो रहा है...
संकेत दिखाएँ

प्रकार को अलग करने और सही क्षेत्र की गणना करने के लिए getArea के अंदर size.kind === 'सर्कल' का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है