টাইপ অ্যাসারশন (Type Assertion)
টাইপ অ্যাসারশন ব্যবহার করে ডেভেলপাররা কম্পাইলারের অনুমানকৃত টাইপকে ওভাররাইড করতে পারেন, অর্থাৎ এটিকে একটি নির্দিষ্ট ধরণের মান জানিয়ে দেয়া যায়।
সরল ভাষায়, টাইপ অ্যাসারশন মানে হচ্ছে আমরা TypeScript-কে সরাসরি বলে দিচ্ছি —
“এই ভ্যারিয়েবলের টাইপ আমি জানি, তুমি এটা নিয়ে চিন্তা করো না!”
আমরা এটি তখনই ব্যবহার করি, যখন আমাদের জানা থাকে যে কোনো ভ্যারিয়েবলের টাইপ কী, কিন্তু TypeScript সেটা ঠিকভাবে বুঝতে পারছে না।
উদাহরণ:
let anything: any; // এখানে একটি ভ্যারিয়েবল ডিফাইন করা হয়েছে যার টাইপ any
anything = 'string'; // এখন টাইপস্ক্রিপ্ট এটি string হিসেবে ধরবে
anything = 3; // এবং এখন এটি number হিসেবে ধরবে
এখানে দেখা যাচ্ছে, একবার এটি string
হিসেবে অনুমান করা হচ্ছে এবং অন্যবার এটি number
হিসেবে অনুমান করা হচ্ছে। এটি সমস্যা তৈরি করতে পারে।
ধরা যাক, আমরা জানি ভ্যারিয়েবলটি হয় number
হবে অথবা শুধুমাত্র string
। কিন্তু TypeScript কম্পাইলারকে এটা শেখাতে আমাদের টাইপ অ্যাসারশন ব্যবহার করতে হবে। দেখা যাক, কীভাবে এটি করা যায়:
🧠 উদাহরণ:
anything as string;
এখন, যদি আমরা এতে string methods
ব্যবহার করতে চাই, তাহলে একটি ব্র্যাকেট দিয়ে ব্যারিয়ার করতে হবে।
(anything as string).length
ফাংশনে টাইপ অ্যাসারশন
আমরা দেখেছি কিভাবে একটি ভ্যারিয়েবলে অ্যাসারশন ব্যবহার করতে পারি, এখন দেখা যাক কিভাবে একটি ফাংশনে এটি ব্যবহার করা যায়:
const kg2gm = (value: number | string): string | number | undefined => {
if (typeof value === 'string') {
const numberedValue = parseFloat(value);
return numberedValue * 1000;
} else if (typeof value === 'number') {
return value * 1000;
}
};
উপরের ফাংশনটি একটি মান গ্রহণ করছে এবং যাচাই করছে সেটি string
না number
। যদি string
হয়, তাহলে এটিকে সংখ্যায় রূপান্তর করে ফিরিয়ে দিচ্ছে। আর যদি number
হয়, তবে সরাসরি গুণফল ফিরিয়ে দিচ্ছে।
রেজাল্ট পরীক্ষা:
const result1 = kg2gm('10'); // রেজাল্ট হবে 10000
const result2 = kg2gm(1); // রেজাল্ট হবে 1000
উপরের রেজাল্টগুলিতে দেখা যাচ্ছে, টাইপস্ক্রিপ্ট রেজাল্টের টাইপকে string | number | undefined
হিসেবে অনুমান করছে। কিন্তু আমরা জানি আসলে কোন ধরনের মান আসবে, তাই আমরা টাইপ অ্যাসারশন দিয়ে এটি নির্দিষ্ট করে বলতে পারি:
const result1 = kg2gm('10') as string; // রেজাল্ট হবে 10000
const result2 = kg2gm(1) as number; // রেজাল্ট হবে 1000
Catch Error-এ Assertion
type CustomErrorMessage = {
message: string,
};
try {
// কোড ব্লক
} catch (error) {
console.log((error as CustomErrorMessage).message);
}
সতর্কতা: টাইপ অ্যাসারশন ব্যবহার করার সময় খুবই সতর্ক থাকতে হবে। কম্পাইলারের অনুমানকে ওভাররাইড করার জন্য অবশ্যই আপনার জানা থাকতে হবে যে মানের প্রকৃত টাইপ কী। যেমন, যদি কোনো ফাংশন number
রিটার্ন করে, আর আপনি সেটিকে string
হিসেবে অ্যাসার্ট করেন, তাহলে সমস্যা তৈরি হবে।
টাইপ ন্যারোইং (Type Narrowing)
টাইপ ন্যারোইং মানে — TypeScript যখন বুঝতে পারে কোনো ভ্যারিয়েবলের টাইপ কী হতে পারে এবং সেই অনুযায়ী আমাদের সাহায্য করে।
এটি বিশেষভাবে কার্যকর তখন, যখন আমরা এমন একটি ভ্যারিয়েবল নিয়ে কাজ করি যার একাধিক সম্ভাব্য টাইপ থাকে (যেমন: string | number
)। টাইপ ন্যারোইং TypeScript-কে বলে দেয়, নির্দিষ্ট অবস্থায় কোন টাইপটি ব্যবহার করতে হবে।
উদাহরণস্বরূপ, নিচের ফাংশনটি দেখুন:
const minuteToSecond = (minute: string | number): string | number | undefined => {
if (typeof minute === 'string') {
return `${minute} minute = ${Number(minute) * 60} second`;
}
if (typeof minute === 'number') {
return minute * 60;
}
};
এখন আমরা ফাংশনটি কল করলে জানি — কোন টাইপের ইনপুট দিলে কোন টাইপের আউটপুট পাবো। তাই আমরা নিশ্চিন্তে টাইপ অ্যাসারশন ব্যবহার করে বলে দিতে পারি —
“এই রিটার্ন ভ্যালুটা এই টাইপই হবে!”
const result1 = minuteToSecond(10) as number;
const result2 = minuteToSecond('10') as string;
কেন Type Narrowing দরকার?
ধরুন, আপনার একটি ভ্যারিয়েবল আছে যা হয় string
অথবা number
হতে পারে। এখন আপনি যদি এর উপরে কোনো অপারেশন করতে চান, তবে TypeScript বুঝতে পারে না কোন টাইপের জন্য কোন অপারেশন করা উচিত।
এমন অবস্থায় TypeScript-এর সাহায্যে আমরা টাইপ ন্যারোইং ব্যবহার করে TypeScript-কে জানাতে পারি — “এই অবস্থায়, এই ভ্যারিয়েবলটি আসলে এই টাইপের”।
কীভাবে Type Narrowing কাজ করে?
TypeScript স্বয়ংক্রিয়ভাবে টাইপ ন্যারোইং করে যখন আপনি কিছু নির্দিষ্ট শর্ত ব্যবহার করেন, যেমনঃ
🚀 Technique | 📌 Description | ✅ Example Code |
---|---|---|
1. typeof চেক করা | ভ্যারিয়েবলের টাইপ চেক করা হয়। | if (typeof value === "string") {<br> console.log("This is a string");<br>}<br> |
2. instanceof চেক করা | অবজেক্ট কোনো ক্লাসের instance কিনা চেক করা হয়। | if (animal instanceof Dog) {<br> animal.bark();<br>}<br> |
3. in অপারেটর চেক করা | অবজেক্টে নির্দিষ্ট প্রপার্টি আছে কিনা চেক করা হয়। | if ("radius" in shape) {<br> console.log("It's a circle");<br>}<br> |
4. কাস্টম টাইপ গার্ড (Custom Guards) | নিজস্ব ফাংশন দিয়ে টাইপ চেক করা হয়। | function isFish(animal: any): animal is Fish {<br> return (animal as Fish).swim !== undefined;<br>}<br> |