মূল কন্টেন্টে যান
মডিউল 2 · 2-এর পাঠ 2কোর্সে 4/14~15 min
মডিউল পাঠ (2/2)

ইউনিয়ন এবং সংকীর্ণ

বাস্তব জগতে, ভেরিয়েবল এবং API প্রতিক্রিয়াগুলির সর্বদা একটি নির্দিষ্ট ধরন থাকে না। TypeScript পরিবর্তনশীলতা সামলাতে ইউনিয়ন টাইপ এবং রানটাইমে নিরাপদে কাজ করার জন্য টাইপ সংকীর্ণ অফার করে।


ইউনিয়ন প্রকার

একটি ইউনিয়ন টাইপ একটি ভেরিয়েবলকে বিভিন্ন ধরনের মান গ্রহণ করতে দেয়। এটি উল্লম্ব বার (|) চিহ্ন ব্যবহার করে প্রকাশ করা হয়:

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

যাইহোক, একটি ইউনিয়ন টাইপের সাথে কাজ করার সময়, আমরা সরাসরি পদ্ধতিগুলিকে কল করতে পারি না যা শুধুমাত্র একটি প্রকারের সাথে সম্পর্কিত (উদাহরণস্বরূপ, আমরা .toUpperCase() কল করতে পারি না যদি ভেরিয়েবলটি একটি number হতে পারে)। আমরা প্রথমে টাইপ "সংকীর্ণ" করতে হবে।


সংকীর্ণতা টাইপ করুন

টাইপ সংকীর্ণ হল এমন একটি প্রক্রিয়া যেখানে টাইপস্ক্রিপ্ট নিয়ন্ত্রণ প্রবাহের কাঠামো বিশ্লেষণ করে (যেমন 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
  }
}

বৈষম্যপূর্ণ ইউনিয়ন

বৈষম্যমূলক ইউনিয়ন প্যাটার্নটি এমন বস্তু তৈরি করে যা একটি অনন্য আক্ষরিক মান সহ একটি সাধারণ সম্পত্তি ভাগ করে (যাকে বৈষম্যকারী বলা হয়)। 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লোড হচ্ছে...

আইডি নামের একটি ভেরিয়েবল ঘোষণা করুন যা একটি সংখ্যা বা একটি স্ট্রিং হতে পারে। এটিকে প্রথমে 101 নম্বর দিয়ে শুরু করুন, তারপর স্ট্রিং মান 'USER-101' নির্ধারণ করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ব্যবহার করুন | লেট ভেরিয়েবল ডিক্লেয়ারেশনে নম্বর এবং স্ট্রিং যোগ করতে অপারেটর।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম 2: মৌলিক প্রকার সংকীর্ণ

ব্যায়াম#ts.m2.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

ফর্ম্যাটইনপুট নামে একটি ফাংশন তৈরি করুন যা স্ট্রিং বা সংখ্যার একটি প্যারামিটার ইনপুট গ্রহণ করে। ইনপুট একটি স্ট্রিং হলে, বড় হাতের অক্ষরে রূপান্তরিত ইনপুট ফেরত দিন। যদি এটি একটি সংখ্যা হয়, 2 দ্বারা গুণিত ইনপুট প্রদান করুন। স্পষ্টভাবে প্রকারগুলি উল্লেখ করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

টাইপফ ইনপুট === 'স্ট্রিং' ব্যবহার করুন একটি if ব্লকের ভিতরে আচরণ শাখা করতে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম 3: 'ইন' দিয়ে সংকুচিত করা

ব্যায়াম#ts.m2.l2.e3
প্রচেষ্টা: 0লোড হচ্ছে...

দুটি ইন্টারফেস কার (পদ্ধতি ড্রাইভ সহ) এবং বোট (পদ্ধতি পাল সহ) দেওয়া, moveVehicle নামে একটি ফাংশন লিখুন যা কার বা বোট ধরণের একটি প্যারামিটার যান গ্রহণ করে। গাড়ির ড্রাইভ বৈশিষ্ট্য থাকলে, ড্রাইভ() পদ্ধতিটি চালান। অন্যথায়, sail() পদ্ধতিটি চালান।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ইন্টারফেস সংকীর্ণ করতে যানবাহনে 'ড্রাইভ' আকারে ইন অপারেটর ব্যবহার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম 4: বৈষম্যযুক্ত ইউনিয়ন আকৃতি

ব্যায়াম#ts.m2.l2.e4
প্রচেষ্টা: 0লোড হচ্ছে...

একটি টাইপ আকৃতি সংজ্ঞায়িত করুন যা দুটি প্রকারের মিলন: বৃত্ত এবং বর্গক্ষেত্র। বৃত্তের একটি ধরনের সম্পত্তি আছে 'বৃত্ত' (আক্ষরিক মান) এবং একটি ব্যাসার্ধ (সংখ্যা)। বর্গক্ষেত্রে 'বর্গ' (আক্ষরিক মান) এবং একটি পার্শ্ব (সংখ্যা) সেট করা একটি ধরনের সম্পত্তি আছে। তারপর একটি ফাংশন getArea লিখুন যেটি আকারের আকার গ্রহণ করে এবং একটি সংখ্যা হিসাবে ক্ষেত্রফল প্রদান করে (বৃত্ত গণিতের জন্য। PI * ব্যাসার্ধ * ব্যাসার্ধ, বর্গক্ষেত্র * পাশের জন্য)।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ধরন বৈষম্য করতে এবং সঠিক এলাকা গণনা করতে getArea-এর ভিতরে shape.kind === 'বৃত্ত' ব্যবহার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ