ماڈیول اسباق (1/2)
قسم کے گارڈز
TypeScript میں Type narrowing سب سے اہم تصورات میں سے ایک ہے۔ تاہم، اکثر معیاری قسم کے گارڈز جیسے typeof یا instanceof پیچیدہ حسب ضرورت اشیاء کے لیے کافی نہیں ہوتے ہیں۔ یہ وہ جگہ ہے جہاں کسٹم ٹائپ گارڈز آتے ہیں۔
معیاری قسم کے گارڈز
آئیے خلاصہ کرتے ہوئے شروع کرتے ہیں کہ کس طرح ٹائپ اسکرپٹ معیاری جاوا اسکرپٹ آپریٹرز کا استعمال کرتے ہوئے اقسام کو تنگ کرتا ہے:
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 کو معلوم ہوگا کہ پاس کردہ پیرامیٹر مخصوص قسم کا ہے۔
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) کمپائلر کو بغیر کسی حقیقی رن ٹائم تصدیق کے ڈویلپر پر بھروسہ کرنے پر مجبور کرتی ہے۔ اگر رن ٹائم آبجیکٹ توقعات پر پورا نہیں اترتا ہے، تو کوڈ خاموشی سے ناکام ہو جائے گا یا مستثنیات پھینک دے گا۔
دوسری طرف، کسٹم ٹائپ گارڈز، ایک مضبوط اور متحرک رن ٹائم چیک کرتے ہیں، محفوظ طریقے سے اور درست طریقے سے ٹائپ اسکرپٹ کمپائلر کو اصل متغیر کی قسم سے آگاہ کرتے ہیں:
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: سٹرنگ ٹائپ گارڈ
isString نام کا ایک سادہ فنکشن بنائیں جو ایک کسٹم ٹائپ گارڈ کے طور پر اس بات کی تصدیق کرنے کے لیے کام کرتا ہے کہ آیا کوئی نامعلوم ویلیو سٹرنگ ہے۔
اشارہ دکھائیں۔
فنکشن کی واپسی کی قسم val is string ہونی چاہیے، اور آپ کو typeof استعمال کرنا چاہیے کہ آیا یہ 'سٹرنگ' کے برابر ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش 2: پریمیم یوزر ٹائپ گارڈ
صارف اور پریمیئم یوزر کی قسموں کو دیکھتے ہوئے، ٹائپ گارڈ فنکشن isPremiumUser(user: User): صارف PremiumUser ہے جو چیک کرتا ہے کہ آیا صارف کا 'پریمیم' کردار ہے۔
اشارہ دکھائیں۔
دستخط کی تعریف بطور فنکشن isPremiumUser(user: User): صارف پریمیئم یوزر ہے اور user.role کا 'premium' سے موازنہ کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 3: کسٹم ایرر آبجیکٹ کی توثیق
isCustomError(err: unknown) کو لاگو کریں: ایرر CustomError فنکشن ہے جو اس بات کی تصدیق کرتا ہے کہ آیا کوئی نامعلوم قدر 'کوڈ' کلید پر مشتمل غیر کالعدم CustomError آبجیکٹ ہے۔
اشارہ دکھائیں۔
پہلے چیک کریں کہ آیا ٹائپ آف ایرر 'آبجیکٹ' ہے اور کالعدم نہیں، پھر 'کوڈ' پراپرٹی کو چیک کرنے کے لیے 'ان' آپریٹر کا استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش 4: ایڈمن ٹائپ گارڈ
دو انٹرفیس یوزر (پراپرٹی رول کے ساتھ: سٹرنگ) اور ایڈمن (صارف کو بڑھانا اور پراپرٹی ایڈمن ٹوکن: سٹرنگ ہونا)، ایک ٹائپ گارڈ فنکشن لکھیں جس کا نام isAdmin ہے جو صارف کی قسم کے صارف کو قبول کرتا ہے اور ایک قسم کا پیش خیمہ صارف ایڈمن کو واپس کرتا ہے۔ گارڈ کو چیک کرنا چاہیے کہ آیا صارف کا کردار 'ایڈمن' کے برابر ہے۔
اشارہ دکھائیں۔
دستخط کی تعریف بطور فنکشن isAdmin(user: User): user is Admin اور چیک کریں کہ آیا user.role === 'admin'۔
3 کوششوں کے بعد حل دستیاب ہے۔