Vivasoft-logo

4.0 জেনেরিক্স

খুব সহজভাবে বলতে গেলে জেনেরিক্স হচ্ছে টাইপস্ক্রিপ্টের এমন একটি ফিচার যার মাধ্যমে রি-ইউজেবল ফাংশন, ক্লাস, ইন্টারফেস সহ ছোট ছোট কোড কম্পোনেন্ট তৈরি করা যায়, যা আলাদা আলাদা ডাটা  টাইপের জন্য কাজ করতে পারে। এই কনসেপ্ট টি যে কেবলমাত্র টাইপস্ক্রিপ্ট  এই ব্যবহার  হয় তা নয়, C#, Java, Rust, Go সহ অন্যান্য  Strongly-Typed Language এই ফিচারটি সাপোর্ট করে।

4.1 জেনেরিক ফাংশন 

একটি জেনেরিক ফাংশন আমরা টাইপ ভ্যারিয়েবল ডিক্লারেশনের মাধ্যমে বিভিন্ন ডেটা টাইপ দ্বারা বারবার ব্যবহার  করতে পারি। জেনেরিক্স এর অন্যান্য Properties ও Usability সম্পর্কে বিস্তারিত আলোচনা করার আগে কিছু ব্যাপারে পরিষ্কার ধারণা থাকা উচিত। যেমন: রি-ইউজেবিলিটি কনসেপ্টটি জেনেরিক্স-এ কিভাবে কাজ করে, টাইপ ভ্যারিয়েবল কি, সাধারণ একটি ফাংশন থেকে একটি জেনেরিক ফাংশন কেন আলাদাভাবে কাজ করে।

একটি সাধারণ উদাহরণ এর মাধ্যমে বিষয়গুলো আলোচনা করা যাক। 

				
					function identity(arg: number): number { 
   return arg; 
}
				
			

এটি একটি সাধারণ identity ফাংশন যা ফাংশনের আর্গুমেন্ট রিটার্ন করে। এই ফাংশনটি কোড এ বারবার কল করা যাবে। তবে এটি কেবলমাত্র নাম্বার টাইপের জন্য ভ্যালিড বা কার্যকর। অন্য কোন টাইপের জন্য এটি কার্যকর নয়। 

একটি জেনেরিক ফাংশন এর বিশেষত্ব এই যে, জেনেরিক ফাংশন অন্যান্য টাইপের জন্য কার্যকর এবং রি-ইউজেবল। ফাংশন বা ক্লাসের নামের পর দুইটি Angle Bracket <  > ব্যবহার করে টাইপ প্যারামিটার ডিফাইন করা যায়। এটিকে টাইপ ভ্যারিয়েবলও বলে। উদাহরণস্বরূপ:

				
					function identity<T>(arg: Type): T {
   return arg;
}
				
			

এখানে ব্র্যাকেট এর মাঝে T হচ্ছে টাইপ প্যারামিটার বা টাইপ ভ্যারিয়েবল। অর্থাৎ টাইপ এই প্যারামিটারে ডাটা টাইপ নির্দিষ্ট করে বলে দেয়া যায়। উদাহরণস্বরূপ:

				
					let result1 = identity<number>(2); ।* T is number *।
let result2 = identity<string>("Hello"); ।* T is string *।
				
			

এখানে দেখা যাচ্ছে টাইপ ভ্যারিয়েবলে  ডিক্লারেশন এর মাধ্যমে  identity ফাংশনটি নাম্বার এবং স্ট্রিং উভয় টাইপের জন্য ব্যবহার  করা হয়েছে। আচ্ছা, তবে একটা প্রশ্ন কিন্তু থেকেই যায় যে, যদি একটি সাধারণ ফাংশনের প্যারামিটারে any টাইপ ব্যবহার  করা  হয় তাহলে সেটি জেনেরিক ফাংশন হবে কি না? যেহেতু ফাংশনটি যেকোনো টাইপের জন্য কার্যকর হবে। এটি কিন্তু খুবই চমৎকার একটি প্রশ্ন।

any টাইপ ফাংশন আর্গুমেন্টে বিভিন্ন ডাটা  টাইপ সমর্থন করলেও ফাংশনটি কি টাইপ রিটার্ন করবে সেটি আমরা জানি না বা নিয়ন্ত্রণ করতে পারি না। এটি জেনেরিক কন্সেপ্ট-এর নিয়ম লঙ্ঘন করে। এই কারণে সাধারণ কোন ফাংশনে any  ব্যবহার করলে সেটি বিভিন্ন টাইপের জন্য রি-ইউজেবল হতে পারে কিন্তু সেটি জেনেরিক ফাংশন হবে না। কোডবেজ মেইন্টেইনেবিলিটির জন্য এটি খুবই গুরুত্বপূর্ণ। তাই জেনেরিক ফাংশনে আমরা টাইপ ভ্যারিয়েবল ( <T> ) ব্যবহার  করি যা ভ্যারিয়েবলের মানের পরিবর্তে টাইপের ওপর কাজ করে।  

তবে Array টাইপের ক্ষেত্রে আলদাভাবে [  ] (থার্ড ব্র্যাকেট)  উল্লেখ করতে হয়। যেমন,

				
					function identity<Type>(array: Type[]): Type[] {
   console.log(array.length);
   return array;
}

// An array of numbers
let numbers = [1, 2, 3];

// Call the generic function with number as the type parameter
let identityNumber = identity<number>(numbers);

// An array of strings
let strings = ["a", "b", "c"];

// Call the generic function with string as the type parameter
let identityStrings = identity<string>(strings);
				
			

কারণ Typescript এ অ্যারে হচ্ছে একটি স্পেশাল ডাটা  টাইপ যা একের অধিক ভ্যালু ধারণ করতে পারে এবং এটি  numerical indexing ব্যবহার  করে। আবার ফাংশনটি এভাবেও লেখা যায়:

				
					function identity<Type>(arg: Array<Type>): Array<Type> {
   console.log(arg.length);
   return arg;
}
				
			

Array<Type> এর মাধ্যমে এটির মধ্যকার Element গুলোর টাইপ নির্দিষ্ট ভাবে বলে দেয়া যায়।