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

یونینز اور تنگ کرنا

حقیقی دنیا میں، متغیرات اور API کے جوابات میں ہمیشہ ایک ہی مقررہ قسم نہیں ہوتی ہے۔ TypeScript تغیرات کو سنبھالنے کے لیے یونین قسمیں اور رن ٹائم پر ان پر محفوظ طریقے سے کام کرنے کے لیے Type Narrowing پیش کرتا ہے۔


یونین کی اقسام

یونین کی قسم متغیر کو مختلف اقسام کی اقدار کو قبول کرنے کی اجازت دیتی ہے۔ اس کا اظہار عمودی بار (|) علامت کا استعمال کرتے ہوئے کیا جاتا ہے:

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

تاہم، یونین کی قسم کے ساتھ کام کرتے وقت، ہم براہ راست ان طریقوں کو کال نہیں کر سکتے جو صرف ایک قسم سے تعلق رکھتے ہوں (مثال کے طور پر، ہم .toUpperCase() کو کال نہیں کر سکتے ہیں اگر متغیر بھی number ہو سکتا ہے)۔ ہمیں پہلے قسم کو "تنگ" کرنا چاہیے۔


تنگ کرنا ٹائپ کریں۔

Type Narrowing وہ عمل ہے جہاں TypeScript رن ٹائم پر متغیر کے لیے زیادہ مخصوص قسم کا اندازہ لگانے کے لیے کنٹرول فلو ڈھانچے (جیسے 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
  }
}

امتیازی یونینز

امتیازی یونینز کا پیٹرن ایسی اشیاء بنانے پر مشتمل ہوتا ہے جو ایک منفرد لفظی قدر (جسے discriminator کہا جاتا ہے) کے ساتھ مشترکہ پراپرٹی کا اشتراک کرتے ہیں۔ TypeScript اس امتیاز کو پہچانتا ہے اور خود بخود قسم کو مشروط بلاکس کے اندر تنگ کر دیتا ہے۔

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لوڈ ہو رہا ہے…

ایک متغیر نام کی id کا اعلان کریں جو یا تو نمبر یا سٹرنگ ہو سکتا ہے۔ اسے پہلے نمبر 101 سے شروع کریں، پھر سٹرنگ ویلیو 'USER-101' تفویض کریں۔

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

استعمال کریں | لیٹ متغیر اعلامیہ میں نمبر اور سٹرنگ جوائن کرنے کے لیے آپریٹر۔

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

ورزش 2: بنیادی قسم کو تنگ کرنا

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

فارمیٹ ان پٹ کے نام سے ایک فنکشن بنائیں جو ٹائپ سٹرنگ یا نمبر کے پیرامیٹر ان پٹ کو قبول کرے۔ اگر ان پٹ ایک سٹرنگ ہے تو، ان پٹ کو بڑے حروف میں تبدیل کر کے واپس کریں۔ اگر یہ ایک عدد ہے تو ان پٹ کو 2 سے ضرب دے کر واپس کریں۔ اقسام کو واضح طور پر بیان کریں۔

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

رویے کو برانچ کرنے کے لیے if block کے اندر typeof input === 'string' استعمال کریں۔

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

ورزش 3: 'ان' کے ساتھ تنگ کرنا

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

دو انٹرفیس کار (میتھڈ ڈرائیو کے ساتھ) اور بوٹ (میتھڈ سیل کے ساتھ) کو دیکھتے ہوئے، موو ویہیکل نام کا فنکشن لکھیں جو کار یا بوٹ کی قسم کی پیرامیٹر گاڑی کو قبول کرتا ہے۔ اگر گاڑی میں ڈرائیو کی خاصیت ہے، تو ڈرائیو() طریقہ پر عمل کریں۔ بصورت دیگر، sail() طریقہ پر عمل کریں۔

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

انٹرفیس کو تنگ کرنے کے لیے گاڑی میں 'ڈرائیو' کی شکل میں ان آپریٹر کا استعمال کریں۔

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

مشق 4: امتیازی یونین کی شکل

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

ایک قسم کی شکل کی وضاحت کریں جو دو اقسام کا اتحاد ہے: دائرہ اور مربع۔ سرکل میں ایک قسم کی خاصیت ہوتی ہے جو 'سرکل' (لفظی قدر) اور ایک رداس (نمبر) پر سیٹ ہوتی ہے۔ اسکوائر میں ایک قسم کی خاصیت 'مربع' (لفظی قدر) اور ایک طرف (نمبر) پر سیٹ ہوتی ہے۔ پھر ایک فنکشن getArea لکھیں جو شکل کی شکل کو قبول کرتا ہے اور رقبہ کو ایک نمبر کے طور پر لوٹاتا ہے (سرکل Math.PI * radius * radius، مربع سائیڈ * side کے لیے)۔

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

قسم کی تفریق کرنے اور صحیح علاقے کا حساب لگانے کے لیے getArea کے اندر shape.kind === 'سرکل' استعمال کریں۔

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