Vivasoft-logo

3.9 আননোন টাইপ এবং নেভার টাইপ

টাইপস্ক্রিপ্টে “unknown” এবং “never” দুটি কনসেপ্ট যা কোডের নিরাপত্তা ও টাইপ সেফটি বজায় রাখতে সহায়তা করে যেন রানটাইমে সম্ভাব্য কোন এরর আমরা আগে থেকে এড়িয়ে চলতে পারি।  

আননোন টাইপ 

“unknown” টাইপকে “any” টাইপের প্রতিরূপ বলা যায়। উভয়ই টাইপস্ক্রিপ্টের “universal supertype”. অর্থাৎ টাইপস্ক্রিপ্ট এর সকল টাইপ “any” অথবা “unknown” টাইপে এসাইন করা যায়। তবে পার্থক্য টা হল টাইপ এসারশন ছাড়াই  “any” টাইপকে যে কোন টাইপে এসাইন করা যায়, কিন্তু “unknown” টাইপকে “any” অথবা “unknown” টাইপ ছাড়া অন্য টাইপে এসাইন করা যায় না। 

টাইপ এসারশন ব্যাপারটা হচ্ছে কম্পাইলারকে নির্দিষ্ট করে টাইপ বলে দেয়া। অর্থাৎ “unknown” টাইপ ব্যবহারে আমাদের এক্সপ্লিসিট বা নির্দিষ্ট হতে হয়। যেমনঃ 

				
					let exampleUnknown:unknown = "Hello World!";
let exampleString:string = exampleUnknown; 
// Type 'unknown' is not assignable to type 'string'.
				
			
				
					exampleUnknown.toLowerCase()
//  'exampleUnknown' is of type 'unknown'.
				
			

এখানে লক্ষ্য করুন unknown টাইপের একটি ভ্যারিয়েবলে string ভ্যালু এসাইন করা হলেও অন্য একটি string টাইপের ভ্যারিয়েবলে unknown টাইপের ভ্যারিয়েবলটি এসাইন করা যাচ্ছে না। অন্যদিকে টাইপস্ক্রিপ্ট এর কোন string মেথডও ব্যবহার করা যাবে না। সেক্ষেত্রে কম্পাইলার আমাদের এরর দিচ্ছে। এখন as ব্যবহার করে যদি টাইপ স্পেসিফাই করে দেয়া হয় তাহলে এই এররটি আর থাকবে না। যেমনঃ 

				
					let exampleUnknown:unknown = "Hello World!";
let exampleString:string = exampleUnknown as string;
exampleString.toLowerCase() // "hello world!"
				
			

এটি একটি টাইপ এসারশন এর উদাহরণ। অন্যদিকে টাইপ চেকিংও ব্যবহার করা যায় এভাবে, 

				
					let exampleUnknown:unknown = "Hello World!";

if(typeof exampleUnknown === "string"){
   exampleUnknown.toLowerCase()
}
				
			

তবে টাইপ চেকিং এর যেকোনো usecase-এ  আমাদের ব্লক স্কোপ এর ব্যাপারটি মাথায় রাখতে হবে। 

unknown টাইপ ব্যবহারে এই রেস্ট্রিকশন বা বাধা নিয়মগুলোই এটিকে টাইপ সেফ করে তোলে। কোডবেজে যদি এমন কোন মেথড থাকে যেটি কেবল একটি ডাটাটাইপের ফাংশনালিটি নিয়ে কাজ করবে, কিন্তু ভুলবশত অন্য একটি টাইপের ডেটা আর্গুমেন্টে পাস করা হয়েছে সেক্ষেত্রে প্রথমে কম্পাইলার এরর না দেখালেও রানটাইমে কোড কিন্তু কাজ করবে না। এটি কোড ডিবাগিং এর ক্ষেত্রে খুব বড় একটি সমস্যা।  unknown টাইপের ব্যবহারে এ ধরেনের সমস্যাগুলো পূর্বেই এড়িয়ে যাওয়া যায়। 

নেভার টাইপ  

“never” টাইপ এমন একটি টাইপ নির্দেশ করে যে টাইপে কোন পসিবল ভ্যালু বা মান হতে পারে না। । যেমন হতে পারে একটি ফাংশন যা কখনই শেষ পর্যন্ত যাবে না বা সব সময় এরর থ্রো করবে, তখন রিটার্ন টাইপ হিসেবে “never” ব্যবহার করা হয়। কিন্তু কেন? অথবা এরকম ফাংশনে never টাইপ ব্যবহার না করলে কি হতে পারে?

আমরা নেভার টাইপটি ব্যবহার করে আসলে unreachable কোড ইন্ডিকেট করতে পারি। ধরা যাক এমন একটি ফাংশন রয়েছে যা সব সময় এরর থ্রো করবে। নিয়ম অনুযায়ী আমাদের এখানে never টাইপ ব্যবহার করা উচিত। আমরা যদি never ব্যবহার না করে any ব্যবহার করি তাহলেও এরর থ্রো করবে এবং ফাংশন এক্সিকিউশন halt করবে। কিন্তু পরবর্তী কোন এক্সিকিউটেবল কোড থাকলে সেটি এরর দেখাবে না। অর্থাৎ আমরা বুঝতেই পারবো না যে কোডবেজে কিছু আনরিচেবল কোড রয়েছে যা এক্সিকিউট হবে না। হয়তো ভুলবশত কোন গুরুত্বপূর্ণ ফাংশন ডিক্লার করা থাকতে পারে। যেমনঃ 

				
					function throwError(error: string): any {
  throw new Error(error);
}
throwError('Error occurred!'); // function halts here


// These lines are not executing but also not showing any error
veryImportantFunction();
console.log('Hello World!');
				
			

এখন আমরা যদি never টাইপ ব্যবহার করিঃ 

				
					function throwError(error: string): never  {
  throw new Error(error);
}

throwError('throw');

// Unreachable code detected.

veryImportantFunction();
console.log('Hello World!')
				
			

এক্ষেত্রে টাইপস্ক্রিপ্ট কম্পাইলার আমাদের এক্সিকিউশনের পূর্বেই এরর দেখাবে। never টাইপের এই নিয়মগুলো আমাদের এরর ফ্রি কোড লিখতে সাহায্য করে, ডিবাগিং সহজ করে, এবং সম্ভব্য রানটাইম এরর আমরা এড়িয়ে চলতে পারি। 

অন্যদিকে কোডে কোন ইনফিনিট লুপ থাকলে, একইরকম ভাবে আমাদের নেভার টাইপ ব্যবহার করতে হবে, নতুবা রানটাইমে explicitly কোড break না করা পর্যন্ত লুপ এক্সিকিউশনেই পড়ে থাকবে। এবং পরবর্তী কোন কোড এক্সিকিউট কেন হচ্ছে না আমরা তার যথাযথ এরর মেসেজ দেখতে পাবো না।

				
					function processEvent(): never {
   while(true){
      // Read an event from queue
   }
}
processEvent();
// Unreachable code detected.

veryImportantFunction();
console.log('Hello World!')
				
			

তবে একটি ব্যাপারে খেয়াল রাখতে হবে tsconfig ফাইলে “allowUnreachableCode”: true থাকা যাবে না। তাহলে টাইপস্ক্রিপ্ট কম্পাইলার এরর মেসেজটি এড়িয়ে যাবে।