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

गार्ड टाइप करें

टाइप संकुचन टाइपस्क्रिप्ट में सबसे महत्वपूर्ण अवधारणाओं में से एक है। हालाँकि, अक्सर मानक प्रकार के गार्ड जैसे typeof या instanceof जटिल कस्टम ऑब्जेक्ट के लिए पर्याप्त नहीं होते हैं। यहीं पर कस्टम टाइप गार्ड आते हैं।

मानक प्रकार के गार्ड

आइए संक्षेप में शुरुआत करें कि टाइपस्क्रिप्ट मानक जावास्क्रिप्ट ऑपरेटरों का उपयोग करके प्रकारों को कैसे सीमित करता है:

TS
function processInput(val: string | number) {
  if (typeof val === 'string') {
    // Here 'val' is of type string
    console.log(val.toUpperCase());
  } else {
    // Here 'val' is of type number
    console.log(val.toFixed(2));
  }
}

कस्टम टाइप गार्ड (is ऑपरेटर)

एक कस्टम टाइप गार्ड को परिभाषित करने के लिए, हम एक फ़ंक्शन बनाते हैं जो मानक बूलियन रिटर्न प्रकार के बजाय parameterName is Type प्रारूप में टाइप प्रेडिकेट लौटाता है।

फ़ंक्शन को एक बूलियन (true या false) लौटाना होगा। यदि यह true लौटाता है, तो टाइपस्क्रिप्ट को पता चल जाएगा कि पारित पैरामीटर निर्दिष्ट प्रकार का है।

TS
interface Cat {
  name: string;
  meow(): void;
}

interface Dog {
  name: string;
  bark(): void;
}

// This is a custom type guard
function isCat(animal: Cat | Dog): animal is Cat {
  return (animal as Cat).meow !== undefined;
}

function makeNoise(pet: Cat | Dog) {
  if (isCat(pet)) {
    // Here TypeScript knows 'pet' is a Cat
    pet.meow();
  } else {
    // Here TypeScript knows 'pet' is a Dog
    pet.bark();
  }
}

सुरक्षा और कास्टिंग (as बनाम टाइप गार्ड)

टाइप कास्टिंग (उदाहरण के लिए, val as Cat) कंपाइलर को बिना किसी वास्तविक रनटाइम सत्यापन के डेवलपर पर भरोसा करने के लिए मजबूर करता है। यदि रनटाइम ऑब्जेक्ट अपेक्षाओं को पूरा नहीं करता है, तो कोड चुपचाप विफल हो जाएगा या अपवाद फेंक देगा।

दूसरी ओर, कस्टम प्रकार के गार्ड, वास्तविक चर प्रकार के टाइपस्क्रिप्ट कंपाइलर को सुरक्षित और सटीक रूप से सूचित करते हुए, एक मजबूत और गतिशील रनटाइम जांच करते हैं:

TS
function processInput(input: unknown) {
  // unsafe casting: could crash if input does not have the split method
  // const str = input as string;
  // console.log(str.split(' '));

  // safe guard
  if (isString(input)) {
    console.log(input.split(' ')); // 100% Safe!
  }
}

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

अभ्यास 1: स्ट्रिंग टाइप गार्ड

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

isString नामक एक सरल फ़ंक्शन बनाएं जो यह सत्यापित करने के लिए एक कस्टम प्रकार गार्ड के रूप में कार्य करता है कि कोई अज्ञात मान एक स्ट्रिंग है या नहीं।

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

फ़ंक्शन का रिटर्न प्रकार वैल इज़ स्ट्रिंग होना चाहिए, और आपको यह जांचने के लिए टाइपऑफ़ का उपयोग करना चाहिए कि यह 'स्ट्रिंग' के बराबर है या नहीं।

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

व्यायाम 2: प्रीमियम उपयोगकर्ता प्रकार गार्ड

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

उपयोगकर्ता और प्रीमियमयूजर प्रकारों को देखते हुए, एक प्रकार का गार्ड फ़ंक्शन लिखें isPremiumUser(user: User): उपयोगकर्ता प्रीमियमयूजर है जो जांच करता है कि उपयोगकर्ता के पास 'प्रीमियम' भूमिका है या नहीं।

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

हस्ताक्षर को फ़ंक्शन isPremiumUser (उपयोगकर्ता: उपयोगकर्ता) के रूप में परिभाषित करें: उपयोगकर्ता प्रीमियम उपयोगकर्ता है और उपयोगकर्ता.भूमिका की तुलना 'प्रीमियम' से करें।

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

अभ्यास 3: कस्टम त्रुटि ऑब्जेक्ट सत्यापन

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

IsCustomError(err: अज्ञात) को लागू करें: err एक CustomError फ़ंक्शन है जो सत्यापित करता है कि क्या कोई अज्ञात मान एक गैर-शून्य CustomError ऑब्जेक्ट है जिसमें 'कोड' कुंजी है।

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

पहले जांचें कि क्या टाइपऑफ़ एरर 'ऑब्जेक्ट' है और शून्य नहीं है, फिर 'कोड' प्रॉपर्टी की जांच करने के लिए 'इन' ऑपरेटर का उपयोग करें।

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

व्यायाम 4: एडमिन टाइप गार्ड

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

दो इंटरफ़ेस उपयोगकर्ता (संपत्ति भूमिका के साथ: स्ट्रिंग) और व्यवस्थापक (उपयोगकर्ता का विस्तार और एक संपत्ति adminToken: स्ट्रिंग) को देखते हुए, isAdmin नामक एक प्रकार का गार्ड फ़ंक्शन लिखें जो उपयोगकर्ता प्रकार के उपयोगकर्ता को स्वीकार करता है और एक प्रकार का अनुमानित उपयोगकर्ता एडमिन लौटाता है। गार्ड को यह जांचना होगा कि उपयोगकर्ता की भूमिका 'एडमिन' के बराबर है या नहीं।

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

हस्ताक्षर को फ़ंक्शन isAdmin (उपयोगकर्ता: उपयोगकर्ता) के रूप में परिभाषित करें: उपयोगकर्ता व्यवस्थापक है और जांचें कि क्या user.role === 'व्यवस्थापक' है।

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