ماڈیول اسباق (2/2)
یونینز اور تنگ کرنا
حقیقی دنیا میں، متغیرات اور API کے جوابات میں ہمیشہ ایک ہی مقررہ قسم نہیں ہوتی ہے۔ TypeScript تغیرات کو سنبھالنے کے لیے یونین قسمیں اور رن ٹائم پر ان پر محفوظ طریقے سے کام کرنے کے لیے Type Narrowing پیش کرتا ہے۔
یونین کی اقسام
یونین کی قسم متغیر کو مختلف اقسام کی اقدار کو قبول کرنے کی اجازت دیتی ہے۔ اس کا اظہار عمودی بار (|) علامت کا استعمال کرتے ہوئے کیا جاتا ہے:
let result: number | string;
result = 42; // Valid
result = 'Error 404'; // Validتاہم، یونین کی قسم کے ساتھ کام کرتے وقت، ہم براہ راست ان طریقوں کو کال نہیں کر سکتے جو صرف ایک قسم سے تعلق رکھتے ہوں (مثال کے طور پر، ہم .toUpperCase() کو کال نہیں کر سکتے ہیں اگر متغیر بھی number ہو سکتا ہے)۔ ہمیں پہلے قسم کو "تنگ" کرنا چاہیے۔
تنگ کرنا ٹائپ کریں۔
Type Narrowing وہ عمل ہے جہاں TypeScript رن ٹائم پر متغیر کے لیے زیادہ مخصوص قسم کا اندازہ لگانے کے لیے کنٹرول فلو ڈھانچے (جیسے if یا switch) کا تجزیہ کرتا ہے۔
تنگ کرنے کے کئی طریقے ہیں:
1. typeof آپریٹر
قدیم اقسام کی تمیز کے لیے مثالی:
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 آپریٹر
یہ چیک کرنے کے لیے استعمال کیا جاتا ہے کہ آیا کسی شے پر کوئی خاص خاصیت موجود ہے:
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
}
}امتیازی یونینز
امتیازی یونینز کا پیٹرن ایسی اشیاء بنانے پر مشتمل ہوتا ہے جو ایک منفرد لفظی قدر (جسے discriminator کہا جاتا ہے) کے ساتھ مشترکہ پراپرٹی کا اشتراک کرتے ہیں۔ TypeScript اس امتیاز کو پہچانتا ہے اور خود بخود قسم کو مشروط بلاکس کے اندر تنگ کر دیتا ہے۔
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: یونین کی اقسام
ایک متغیر نام کی id کا اعلان کریں جو یا تو نمبر یا سٹرنگ ہو سکتا ہے۔ اسے پہلے نمبر 101 سے شروع کریں، پھر سٹرنگ ویلیو 'USER-101' تفویض کریں۔
اشارہ دکھائیں۔
استعمال کریں | لیٹ متغیر اعلامیہ میں نمبر اور سٹرنگ جوائن کرنے کے لیے آپریٹر۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش 2: بنیادی قسم کو تنگ کرنا
فارمیٹ ان پٹ کے نام سے ایک فنکشن بنائیں جو ٹائپ سٹرنگ یا نمبر کے پیرامیٹر ان پٹ کو قبول کرے۔ اگر ان پٹ ایک سٹرنگ ہے تو، ان پٹ کو بڑے حروف میں تبدیل کر کے واپس کریں۔ اگر یہ ایک عدد ہے تو ان پٹ کو 2 سے ضرب دے کر واپس کریں۔ اقسام کو واضح طور پر بیان کریں۔
اشارہ دکھائیں۔
رویے کو برانچ کرنے کے لیے if block کے اندر typeof input === 'string' استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش 3: 'ان' کے ساتھ تنگ کرنا
دو انٹرفیس کار (میتھڈ ڈرائیو کے ساتھ) اور بوٹ (میتھڈ سیل کے ساتھ) کو دیکھتے ہوئے، موو ویہیکل نام کا فنکشن لکھیں جو کار یا بوٹ کی قسم کی پیرامیٹر گاڑی کو قبول کرتا ہے۔ اگر گاڑی میں ڈرائیو کی خاصیت ہے، تو ڈرائیو() طریقہ پر عمل کریں۔ بصورت دیگر، sail() طریقہ پر عمل کریں۔
اشارہ دکھائیں۔
انٹرفیس کو تنگ کرنے کے لیے گاڑی میں 'ڈرائیو' کی شکل میں ان آپریٹر کا استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
مشق 4: امتیازی یونین کی شکل
ایک قسم کی شکل کی وضاحت کریں جو دو اقسام کا اتحاد ہے: دائرہ اور مربع۔ سرکل میں ایک قسم کی خاصیت ہوتی ہے جو 'سرکل' (لفظی قدر) اور ایک رداس (نمبر) پر سیٹ ہوتی ہے۔ اسکوائر میں ایک قسم کی خاصیت 'مربع' (لفظی قدر) اور ایک طرف (نمبر) پر سیٹ ہوتی ہے۔ پھر ایک فنکشن getArea لکھیں جو شکل کی شکل کو قبول کرتا ہے اور رقبہ کو ایک نمبر کے طور پر لوٹاتا ہے (سرکل Math.PI * radius * radius، مربع سائیڈ * side کے لیے)۔
اشارہ دکھائیں۔
قسم کی تفریق کرنے اور صحیح علاقے کا حساب لگانے کے لیے getArea کے اندر shape.kind === 'سرکل' استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔