مرکزی مواد پر جائیں
ماڈیول 5 · سبق 1 از 2کورس میں 9/14~15 min
ماڈیول اسباق (1/2)

قسم کے گارڈز

TypeScript میں Type narrowing سب سے اہم تصورات میں سے ایک ہے۔ تاہم، اکثر معیاری قسم کے گارڈز جیسے 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 لوٹاتا ہے تو TypeScript کو معلوم ہوگا کہ پاس کردہ پیرامیٹر مخصوص قسم کا ہے۔

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 نام کا ایک سادہ فنکشن بنائیں جو ایک کسٹم ٹائپ گارڈ کے طور پر اس بات کی تصدیق کرنے کے لیے کام کرتا ہے کہ آیا کوئی نامعلوم ویلیو سٹرنگ ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

فنکشن کی واپسی کی قسم val is string ہونی چاہیے، اور آپ کو typeof استعمال کرنا چاہیے کہ آیا یہ 'سٹرنگ' کے برابر ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش 2: پریمیم یوزر ٹائپ گارڈ

ورزش#ts.m5.l1.e2
کوششیں: 0لوڈ ہو رہا ہے…

صارف اور پریمیئم یوزر کی قسموں کو دیکھتے ہوئے، ٹائپ گارڈ فنکشن isPremiumUser(user: User): صارف PremiumUser ہے جو چیک کرتا ہے کہ آیا صارف کا 'پریمیم' کردار ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

دستخط کی تعریف بطور فنکشن isPremiumUser(user: User): صارف پریمیئم یوزر ہے اور user.role کا 'premium' سے موازنہ کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔

مشق 3: کسٹم ایرر آبجیکٹ کی توثیق

ورزش#ts.m5.l1.e3
کوششیں: 0لوڈ ہو رہا ہے…

isCustomError(err: unknown) کو لاگو کریں: ایرر CustomError فنکشن ہے جو اس بات کی تصدیق کرتا ہے کہ آیا کوئی نامعلوم قدر 'کوڈ' کلید پر مشتمل غیر کالعدم CustomError آبجیکٹ ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

پہلے چیک کریں کہ آیا ٹائپ آف ایرر 'آبجیکٹ' ہے اور کالعدم نہیں، پھر 'کوڈ' پراپرٹی کو چیک کرنے کے لیے 'ان' آپریٹر کا استعمال کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش 4: ایڈمن ٹائپ گارڈ

ورزش#ts.m5.l1.e4
کوششیں: 0لوڈ ہو رہا ہے…

دو انٹرفیس یوزر (پراپرٹی رول کے ساتھ: سٹرنگ) اور ایڈمن (صارف کو بڑھانا اور پراپرٹی ایڈمن ٹوکن: سٹرنگ ہونا)، ایک ٹائپ گارڈ فنکشن لکھیں جس کا نام isAdmin ہے جو صارف کی قسم کے صارف کو قبول کرتا ہے اور ایک قسم کا پیش خیمہ صارف ایڈمن کو واپس کرتا ہے۔ گارڈ کو چیک کرنا چاہیے کہ آیا صارف کا کردار 'ایڈمن' کے برابر ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

دستخط کی تعریف بطور فنکشن isAdmin(user: User): user is Admin اور چیک کریں کہ آیا user.role === 'admin'۔

3 کوششوں کے بعد حل دستیاب ہے۔