TypeScript ফাংশন এবং জেনেরিকস

টাইপস্ক্রিপ্ট (Typescript) - Web Development

301

TypeScript এ ফাংশন এবং জেনেরিকস ব্যবহারের মাধ্যমে কোডকে আরো আরও আরও শক্তিশালী, পুনঃব্যবহারযোগ্য, এবং টাইপ-সেফ করা যায়। এখানে ফাংশন এবং জেনেরিকস কীভাবে কাজ করে তা বিস্তারিতভাবে আলোচনা করা হবে।


১. ফাংশন এবং টাইপিং

TypeScript এ ফাংশনের প্যারামিটার এবং রিটার্ন টাইপ সুনির্দিষ্টভাবে টাইপ ডিফাইন করা হয়। এটি কোডের মান বাড়াতে এবং টাইপ সম্পর্কিত ভুল এড়াতে সাহায্য করে।

উদাহরণ:

function add(a: number, b: number): number {
  return a + b;
}

let result = add(2, 3); // সঠিক
let invalidResult = add("2", 3); // ভুল: প্যারামিটার `a` টাইপ `number` হওয়া উচিত

এখানে add ফাংশনটি দুটি number প্যারামিটার নেয় এবং একটি number রিটার্ন করে।


২. ফাংশনের অপশনাল প্যারামিটার

TypeScript এ, আপনি ফাংশনের প্যারামিটারগুলোকে অপশনাল বানাতে পারেন। অপশনাল প্যারামিটার মানে, ফাংশনটি ঐ প্যারামিটার ছাড়াও কাজ করতে পারবে।

উদাহরণ:

function greet(name: string, age?: number): void {
  console.log(`Hello, ${name}`);
  if (age !== undefined) {
    console.log(`You are ${age} years old.`);
  }
}

greet("Alice");  // সঠিক, age প্যারামিটার নেই
greet("Bob", 30);  // সঠিক, age প্যারামিটার আছে

এখানে, age প্যারামিটারটি অপশনাল, তাই এটি না দিলেও ফাংশনটি সঠিকভাবে কাজ করবে।


৩. ফাংশনে ডিফল্ট মান (Default Parameters)

TypeScript এ, আপনি ফাংশনের প্যারামিটারগুলির জন্য ডিফল্ট মান নির্ধারণ করতে পারেন। যদি ফাংশন কলের সময় ঐ প্যারামিটারটি না দেওয়া হয়, তাহলে ডিফল্ট মান ব্যবহার করা হবে।

উদাহরণ:

function greet(name: string, age: number = 25): void {
  console.log(`Hello, ${name}`);
  console.log(`You are ${age} years old.`);
}

greet("Alice");  // `age` প্যারামিটারটি ডিফল্ট মান 25 নেবে
greet("Bob", 30);  // `age` প্যারামিটারটি 30 নেবে

এখানে age প্যারামিটারটির ডিফল্ট মান 25 দেওয়া হয়েছে।


৪. জেনেরিকস (Generics)

জেনেরিকস TypeScript এ একটি শক্তিশালী বৈশিষ্ট্য, যা আপনাকে ফাংশন, ক্লাস, ইন্টারফেস, এবং অন্যান্য টেমপ্লেট টাইপ তৈরি করতে সাহায্য করে। জেনেরিকস আপনার কোডকে আরও পুনঃব্যবহারযোগ্য এবং টাইপ-সেফ করে তোলে, কারণ এটি বিভিন্ন ধরনের ডাটা টাইপের জন্য কাজ করতে পারে।

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

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

উদাহরণ:

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

let numberIdentity = identity(5);   // `T` হবে `number`
let stringIdentity = identity("Hello"); // `T` হবে `string`

এখানে, identity ফাংশনটি একটি জেনেরিক ফাংশন, যেখানে T হলো টাইপ প্যারামিটার। এটি যেকোনো টাইপ গ্রহণ করতে পারে এবং সেই টাইপে ফিরে আসবে। যেমন numberIdentity এর জন্য T টাইপ হবে number এবং stringIdentity এর জন্য T হবে string


৫. জেনেরিক ইন্টারফেস

জেনেরিকস শুধুমাত্র ফাংশনেই নয়, ইন্টারফেসেও ব্যবহার করা যায়। এটি আমাদেরকে ডাটা স্ট্রাকচারের টাইপকে সাধারণভাবে সংজ্ঞায়িত করতে সাহায্য করে।

উদাহরণ:

interface Box<T> {
  value: T;
}

let numberBox: Box<number> = { value: 123 };
let stringBox: Box<string> = { value: "Hello" };

এখানে, Box ইন্টারফেসটি একটি জেনেরিক ইন্টারফেস, যেখানে T টাইপ প্যারামিটারটি দিয়ে আমরা যেকোনো টাইপের ডাটা ধারণ করতে পারি। এই ক্ষেত্রে, numberBox এর জন্য T টাইপ হবে number এবং stringBox এর জন্য T টাইপ হবে string


৬. জেনেরিক কনস্ট্রেইন্টস (Constraints)

আপনি যখন জেনেরিক টাইপ ব্যবহার করেন, তখন কিছু কনস্ট্রেইন্ট যোগ করতে পারেন, যাতে টাইপটি একটি নির্দিষ্ট টাইপের অবজেক্টের উপরে সীমাবদ্ধ থাকে।

উদাহরণ:

function getLength<T extends { length: number }>(arg: T): number {
  return arg.length;
}

console.log(getLength("Hello"));  // সঠিক, string এর length রয়েছে
console.log(getLength([1, 2, 3]));  // সঠিক, array এর length রয়েছে
console.log(getLength(123));  // ভুল, number এ length নেই

এখানে T extends { length: number } কনস্ট্রেইন্টটি বলছে যে T টাইপের ডাটা অবশ্যই length প্রপার্টি থাকতে হবে।


সারাংশ

TypeScript এ ফাংশন এবং জেনেরিকস এর মাধ্যমে আপনি কোডের টাইপিং আরও সুনির্দিষ্ট এবং শক্তিশালী করতে পারেন। ফাংশনের টাইপিং আপনাকে প্যারামিটার এবং রিটার্ন টাইপ সঠিকভাবে নির্ধারণ করতে সাহায্য করে, এবং জেনেরিকস ডাটা টাইপের ওপর নির্ভরশীল ফাংশন বা ক্লাস তৈরি করার সুযোগ দেয় যা একাধিক ডাটা টাইপের সাথে কাজ করতে পারে। এই বৈশিষ্ট্যগুলো TypeScript কে আরো শক্তিশালী, টাইপ-সেফ এবং পুনঃব্যবহারযোগ্য কোড তৈরি করতে সহায়তা করে।

Content added By

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


১. ফাংশন সিগনেচার (Function Signature)

ফাংশন সিগনেচার হলো একটি ফাংশনের টাইপ নির্ধারণের উপায়। এটি ফাংশনের আর্গুমেন্টের টাইপ এবং রিটার্ন টাইপ সংজ্ঞায়িত করে, যাতে ফাংশন কল করার সময় সঠিক মান প্রদান করা হয়।

ফাংশন সিগনেচারের সাধারণ গঠন:

function functionName(param1: Type1, param2: Type2): ReturnType {
    // function body
}

এখানে:

  • param1, param2: ফাংশনের ইনপুট প্যারামিটার।
  • Type1, Type2: প্যারামিটারগুলির টাইপ।
  • ReturnType: ফাংশনের রিটার্ন টাইপ।

২. ফাংশন ডিক্লেয়ারেশন এবং টাইপিং

TypeScript এ আপনি ফাংশনের টাইপ নির্ধারণ করতে পারেন ফাংশন ডিক্লেয়ারেশনের মাধ্যমে। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো:

উদাহরণ ১: সিম্পল ফাংশন

function greet(name: string): string {
    return `Hello, ${name}!`;
}

let message = greet("Alice");
console.log(message);  // Output: Hello, Alice!

এখানে:

  • ফাংশন greet একটি string টাইপের প্যারামিটার নেয় (নাম) এবং একটি string টাইপের মান রিটার্ন করে।

৩. ফাংশন টাইপ ডিক্লেয়ারেশন (Function Type Declaration)

TypeScript এ আপনি একটি ভ্যারিয়েবলের মাধ্যমে ফাংশনের টাইপও নির্ধারণ করতে পারেন। এটি ব্যবহার করা হয় যখন আপনি একটি ফাংশনকে ভ্যারিয়েবল হিসাবে সংরক্ষণ করেন এবং সেই ভ্যারিয়েবলের মাধ্যমে ফাংশনটি কল করতে চান।

উদাহরণ ২: ফাংশন টাইপ ডিক্লেয়ারেশন

let add: (a: number, b: number) => number = (x, y) => {
    return x + y;
};

console.log(add(2, 3));  // Output: 5

এখানে:

  • add ভ্যারিয়েবলের টাইপ সিগনেচার হলো (a: number, b: number) => number যা নির্দেশ করে add ফাংশন দুটি number টাইপের প্যারামিটার গ্রহণ করবে এবং একটি number টাইপের মান রিটার্ন করবে।

৪. অপশনাল প্যারামিটার (Optional Parameters)

TypeScript এ একটি ফাংশনে অপশনাল প্যারামিটারও হতে পারে। এটি নির্ধারণ করতে আপনি প্যারামিটার নামের পরে ? চিহ্ন ব্যবহার করবেন। এটি নির্দেশ করে যে প্যারামিটারটি অবশ্যই প্রয়োজনীয় নয় এবং এটি অনুপস্থিতও থাকতে পারে।

উদাহরণ ৩: অপশনাল প্যারামিটার

function greet(name: string, age?: number): string {
    if (age) {
        return `Hello, ${name}! You are ${age} years old.`;
    } else {
        return `Hello, ${name}!`;
    }
}

console.log(greet("Alice"));         // Output: Hello, Alice!
console.log(greet("Bob", 25));       // Output: Hello, Bob! You are 25 years old.

এখানে:

  • age প্যারামিটারটি অপশনাল, অর্থাৎ আপনি এটি ছাড়াও ফাংশনটি কল করতে পারবেন।

৫. ডিফল্ট প্যারামিটার (Default Parameters)

TypeScript এ ফাংশনের প্যারামিটারগুলোর জন্য আপনি ডিফল্ট মান নির্ধারণ করতে পারেন। যদি কল করার সময় সেই প্যারামিটারটি দেওয়া না হয়, তবে ডিফল্ট মান ব্যবহার করা হবে।

উদাহরণ ৪: ডিফল্ট প্যারামিটার

function greet(name: string, age: number = 30): string {
    return `Hello, ${name}! You are ${age} years old.`;
}

console.log(greet("Alice"));       // Output: Hello, Alice! You are 30 years old.
console.log(greet("Bob", 25));     // Output: Hello, Bob! You are 25 years old.

এখানে:

  • age প্যারামিটারটির জন্য ডিফল্ট মান 30 নির্ধারণ করা হয়েছে। যদি এটি দেওয়া না হয়, তাহলে 30 ব্যবহৃত হবে।

৬. ফাংশন রিটার্ন টাইপ

TypeScript এ ফাংশনের রিটার্ন টাইপও নির্ধারণ করা যায়। ফাংশনের শেষে রিটার্ন টাইপ দেওয়া হয়, যাতে নির্দিষ্ট করা যায় যে ফাংশনটি কোন ধরনের ডেটা রিটার্ন করবে।

উদাহরণ ৫: রিটার্ন টাইপ

function square(num: number): number {
    return num * num;
}

console.log(square(5));  // Output: 25

এখানে:

  • square ফাংশনটি একটি number টাইপের ইনপুট নেয় এবং একটি number টাইপের আউটপুট প্রদান করে।

৭. ফাংশন টাইপের উন্নত উদাহরণ

TypeScript এ আপনি আরও জটিল টাইপগুলির সাথে ফাংশন ব্যবহার করতে পারেন। যেমন, একটি ফাংশন যেটি কলব্যাক ফাংশন গ্রহণ করে বা একটি ফাংশন যা একাধিক ভিন্ন টাইপের আর্গুমেন্ট গ্রহণ করে।

উদাহরণ ৬: কলব্যাক ফাংশন

function processUserInput(callback: (input: string) => void) {
    let userInput = "Hello, World!";
    callback(userInput);
}

processUserInput((input) => {
    console.log(input);  // Output: Hello, World!
});

এখানে:

  • processUserInput ফাংশনটি একটি কলব্যাক ফাংশন গ্রহণ করে যা string ইনপুট নেয় এবং কিছু কাজ সম্পন্ন করে।

সারাংশ

TypeScript এ ফাংশন টাইপস এবং সিগনেচার ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ কারণ এটি আপনার কোডের টাইপ সেফটি নিশ্চিত করে। TypeScript এর মাধ্যমে আপনি:

  • ফাংশনের প্যারামিটার এবং রিটার্ন টাইপ নির্দিষ্ট করতে পারেন,
  • অপশনাল এবং ডিফল্ট প্যারামিটার ব্যবহার করতে পারেন,
  • কলব্যাক ফাংশন এবং জটিল টাইপস সহ ফাংশন তৈরি করতে পারেন।

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

Content added By

TypeScript-এ জেনেরিক টাইপস একটি অত্যন্ত শক্তিশালী বৈশিষ্ট্য, যা আপনাকে একটি সাধারণ, পুনঃব্যবহারযোগ্য টাইপ তৈরি করতে দেয় যা বিভিন্ন ডেটা টাইপের সাথে কাজ করতে পারে। জেনেরিক টাইপস আপনাকে টাইপ সেফটি বজায় রেখে কোডকে আরও সাধারণ এবং নমনীয় করতে সাহায্য করে। এটি প্রোগ্রামিংয়ে ডাটার টাইপে নমনীয়তা এনে দেয় এবং একই কোডে বিভিন্ন ধরনের ডেটা সঠিকভাবে পরিচালনা করতে সক্ষম করে।


১. জেনেরিক টাইপস কী?

জেনেরিক টাইপস এমন একটি কনসেপ্ট, যা এক্সপ্রেশন বা ফাংশনের মধ্যে টাইপ প্যারামিটার ব্যবহার করতে দেয়। এর মাধ্যমে আপনি এমন একটি ফাংশন বা ক্লাস তৈরি করতে পারেন যা নির্দিষ্ট টাইপ এর পরিবর্তে একাধিক টাইপ এর সাথে কাজ করবে। আপনি ফাংশন, ক্লাস বা ইন্টারফেসের মধ্যে টাইপ প্যারামিটার ব্যবহার করে একটি টাইপ নির্ধারণ করতে পারেন যা প্রজেক্টের প্রয়োজনে যেকোনো টাইপের সাথে কাজ করবে।

২. জেনেরিক টাইপস ব্যবহার করার সুবিধা

  • টাইপ সেফটি: জেনেরিক টাইপস ব্যবহার করলে কোডে টাইপ চেকিং সঠিকভাবে করা সম্ভব হয়, যা ভুল টাইপের ব্যবহার থেকে রক্ষা করে।
  • কোড পুনঃব্যবহারযোগ্যতা: একই কোড একাধিক টাইপের জন্য ব্যবহার করা যায়, যা কোড পুনঃব্যবহারযোগ্য করে তোলে।
  • ভুল টাইপ ব্যবহারের সুযোগ কমানো: জেনেরিক টাইপস টাইপ সেফটি নিশ্চিত করে, যার ফলে ভুল টাইপ ব্যবহারের সম্ভাবনা কমে যায়।

৩. জেনেরিক টাইপস এর উদাহরণ

১. জেনেরিক ফাংশন

জেনেরিক ফাংশন লেখার মাধ্যমে আপনি একাধিক টাইপের জন্য একটাই ফাংশন তৈরি করতে পারেন। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো:

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

let result1 = identity(5);           // result1 এর টাইপ হবে 'number'
let result2 = identity("Hello");     // result2 এর টাইপ হবে 'string'

এখানে T একটি টাইপ প্যারামিটার, যা identity ফাংশনের মধ্যে ডাটা টাইপ হিসাবে কাজ করছে। identity ফাংশন যেকোনো টাইপ গ্রহণ করতে সক্ষম, এবং যেহেতু এটি জেনেরিক ফাংশন, এটি যেকোনো ধরনের ডেটা সঠিকভাবে রিটার্ন করবে।

২. জেনেরিক অ্যারে

আপনি যদি একটি ফাংশন তৈরি করতে চান যা অ্যারে গ্রহণ করবে এবং টাইপ সেফ থাকতে চাইলে, তখন জেনেরিক টাইপস খুবই কার্যকরী। নিচে একটি উদাহরণ দেওয়া হয়েছে:

function logArray<T>(arr: T[]): void {
  arr.forEach(item => console.log(item));
}

logArray([1, 2, 3]);    // কাজ করবে: array of numbers
logArray(["a", "b"]);   // কাজ করবে: array of strings

এখানে, T[] এর মানে হলো যে অ্যারে T টাইপের যেকোনো উপাদান ধারণ করতে পারে।

৩. জেনেরিক ক্লাস

জেনেরিক টাইপ শুধু ফাংশনে নয়, ক্লাসেও ব্যবহার করা যায়। নিচে একটি ক্লাসের উদাহরণ দেওয়া হলো যা জেনেরিক টাইপ ব্যবহার করে:

class Box<T> {
  private value: T;
  
  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

let numberBox = new Box<number>(10);
let stringBox = new Box<string>("Hello");

console.log(numberBox.getValue());  // 10
console.log(stringBox.getValue());  // "Hello"

এখানে Box ক্লাসে T টাইপ প্যারামিটারটি কোনো টাইপ গ্রহণ করতে পারে। আমরা যখন Box ক্লাসের একটি ইনস্ট্যান্স তৈরি করি, তখন টাইপটি নির্ধারণ করা হয়। উদাহরণস্বরূপ, numberBox একটি number টাইপ ধারণ করবে, এবং stringBox একটি string টাইপ ধারণ করবে।


৪. জেনেরিক টাইপস এর নির্দিষ্ট সীমাবদ্ধতা (Constraints)

প্রয়োজন হলে, আপনি জেনেরিক টাইপ প্যারামিটারগুলোর উপর সীমাবদ্ধতা (constraints) প্রয়োগ করতে পারেন, যাতে তারা নির্দিষ্ট টাইপ বা টাইপের উপসেট হতে পারে। এতে কোড আরও নির্দিষ্ট এবং নিরাপদ হয়।

উদাহরণ:

function loggingIdentity<T extends { length: number }>(arg: T): T {
  console.log(arg.length);
  return arg;
}

loggingIdentity([1, 2, 3]);      // এটি কাজ করবে, কারণ Array এর length প্রপার্টি আছে
loggingIdentity("Hello");       // এটি কাজ করবে, কারণ string এর length প্রপার্টি আছে
loggingIdentity(10);            // ত্রুটি হবে, কারণ number টাইপের length প্রপার্টি নেই

এখানে T extends { length: number } দ্বারা আমরা টাইপ T এর উপর একটি কনস্ট্রেইন্ট প্রয়োগ করেছি, যাতে এটি এমন একটি টাইপ হতে হবে যা length প্রপার্টি ধারণ করে।


৫. জেনেরিক টাইপস ব্যবহার করার সময় সতর্কতা

যদিও জেনেরিক টাইপস অত্যন্ত শক্তিশালী এবং নমনীয়, তবে কিছু ক্ষেত্রে তাদের ব্যবহারে সতর্ক থাকা উচিত:

  • কমপ্লেক্স কনস্ট্রেইন্ট: জেনেরিক টাইপের সাথে অতিরিক্ত কনস্ট্রেইন্ট যোগ করলে কোডের জটিলতা বেড়ে যেতে পারে। তবে তা কোডের নির্ভুলতা নিশ্চিত করতে সাহায্য করবে।
  • সহজ ব্যবহার: আপনি যখন জেনেরিক টাইপ ব্যবহার করেন, তখন নিশ্চিত হন যে অন্য ডেভেলপাররা সহজে টাইপ প্যারামিটারটি বুঝতে পারে।

সারাংশ

জেনেরিক টাইপস TypeScript এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা কোডের পুনঃব্যবহারযোগ্যতা এবং টাইপ সেফটি বাড়ায়। এগুলি ব্যবহার করে আপনি টাইপ নির্ধারণে নমনীয়তা এনে পুরো প্রজেক্টে কোডের সঠিকতা নিশ্চিত করতে পারেন। জেনেরিক ফাংশন, ক্লাস, এবং অ্যারে তৈরির মাধ্যমে আপনার কোডকে আরও সাধারণ এবং কার্যকরী করতে পারবেন।

Content added By

TypeScript এ জেনেরিকস (Generics) একটি শক্তিশালী ফিচার, যা আপনাকে একাধিক টাইপের জন্য পুনঃব্যবহারযোগ্য কোড লিখতে সাহায্য করে। এটি কোডের টাইপ সেফটি বজায় রেখে টাইপ পরিবর্তনযোগ্যতা এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করে। আপনি জেনেরিক ফাংশন এবং ক্লাস তৈরি করতে পারবেন, যা বিভিন্ন টাইপের ডেটার সাথে কাজ করতে পারে।


১. জেনেরিক ফাংশন (Generic Functions)

TypeScript এ জেনেরিক ফাংশন তৈরি করার জন্য <> এর মধ্যে টাইপ প্যারামিটার ব্যবহার করতে হয়। এই টাইপ প্যারামিটার ফাংশনের মধ্যে সেই টাইপের ডেটা মান নিয়ে কাজ করবে। এটি সাধারণত T, U, K ইত্যাদি নামে নামকরণ করা হয়, তবে আপনি ইচ্ছেমত নাম ব্যবহার করতে পারেন।

উদাহরণ: সাধারণ জেনেরিক ফাংশন

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

let num = identity(10);    // num টাইপ হবে 'number'
let str = identity("Hello"); // str টাইপ হবে 'string'

এখানে:

  • identity একটি জেনেরিক ফাংশন, যা T টাইপ প্যারামিটার গ্রহণ করে এবং সেই টাইপের মান রিটার্ন করে।
  • T একটি টাইপ প্যারামিটার, যা ফাংশনের টাইপের উপর ভিত্তি করে পরে পরিবর্তিত হয়।
  • num এবং str ভেরিয়েবলগুলি যথাক্রমে number এবং string টাইপ হিসেবে ডিডাক্ট হয়।

আরও একটি উদাহরণ (ডেটা অ্যারে):

function getFirstElement<T>(arr: T[]): T {
  return arr[0];
}

let firstNumber = getFirstElement([1, 2, 3]); // firstNumber হবে 'number'
let firstString = getFirstElement(["a", "b", "c"]); // firstString হবে 'string'

এখানে, T টাইপ প্যারামিটারটি অ্যারে arr এর উপাদানের টাইপ অনুযায়ী পরিবর্তিত হয়।


২. জেনেরিক ক্লাস (Generic Classes)

TypeScript এ ক্লাসও জেনেরিক হতে পারে, অর্থাৎ আপনি ক্লাসের মধ্যে টাইপ প্যারামিটার ব্যবহার করতে পারেন যা সেই ক্লাসের ডেটা ম্যানিপুলেশন বা প্রপার্টির টাইপ নির্ধারণ করবে।

উদাহরণ: জেনেরিক ক্লাস

class Box<T> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

let numberBox = new Box(123);   // numberBox এর টাইপ হবে 'number'
let stringBox = new Box("Hello"); // stringBox এর টাইপ হবে 'string'

console.log(numberBox.getValue());  // আউটপুট: 123
console.log(stringBox.getValue());  // আউটপুট: Hello

এখানে:

  • Box একটি জেনেরিক ক্লাস, যা T টাইপ প্যারামিটার নেয়।
  • এই ক্লাসের মধ্যে value প্রপার্টি এবং getValue() মেথড রয়েছে, যা T টাইপের ডেটার সঙ্গে কাজ করে।

ক্লাসের মধ্যে একাধিক টাইপ প্যারামিটার ব্যবহার করা:

class Pair<K, V> {
  private key: K;
  private value: V;

  constructor(key: K, value: V) {
    this.key = key;
    this.value = value;
  }

  getKey(): K {
    return this.key;
  }

  getValue(): V {
    return this.value;
  }
}

let pair = new Pair<string, number>("age", 30);
console.log(pair.getKey());    // আউটপুট: age
console.log(pair.getValue());  // আউটপুট: 30

এখানে, Pair ক্লাসে দুটি টাইপ প্যারামিটার (K এবং V) ব্যবহার করা হয়েছে। key এবং value প্রপার্টিগুলি 각각 K এবং V টাইপের ডেটা ধারণ করবে।


৩. জেনেরিক ক্লাসের জন্য ডিফল্ট টাইপ (Default Types for Generics)

TypeScript এ আপনি জেনেরিক টাইপের জন্য ডিফল্ট টাইপও প্রদান করতে পারেন। এটি যখন টাইপ প্যারামিটার সরবরাহ করা না হয়, তখন ডিফল্ট টাইপটি ব্যবহৃত হবে।

উদাহরণ: ডিফল্ট টাইপ

class Container<T = string> {
  private value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

let stringContainer = new Container("Hello, TypeScript!");
console.log(stringContainer.getValue()); // আউটপুট: Hello, TypeScript!

let numberContainer = new Container(100); // numberContainer টাইপ হবে 'number'
console.log(numberContainer.getValue());  // আউটপুট: 100

এখানে:

  • Container ক্লাসে T = string ডিফল্ট টাইপ ব্যবহার করা হয়েছে। তাই যদি T টাইপ প্যারামিটার না দেওয়া হয়, তবে এটি string টাইপ হিসেবে আচরণ করবে।

৪. জেনেরিক কনস্ট্রেইন্টস (Generic Constraints)

TypeScript এ আপনি জেনেরিক টাইপগুলোর উপর কিছু কনস্ট্রেইন্ট (constraints) প্রয়োগ করতে পারেন। অর্থাৎ, আপনি নির্দিষ্ট করতে পারেন যে জেনেরিক টাইপটি কোন বিশেষ শ্রেণী বা ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ হতে হবে।

উদাহরণ: কনস্ট্রেইন্ট ব্যবহার

interface Lengthwise {
  length: number;
}

function logLength<T extends Lengthwise>(item: T): void {
  console.log(item.length);
}

logLength("Hello");  // আউটপুট: 5
logLength([1, 2, 3]); // আউটপুট: 3

এখানে:

  • T extends Lengthwise দ্বারা আমরা নিশ্চিত করছি যে T টাইপের একটি length প্রপার্টি থাকতে হবে। সুতরাং, শুধু সেই টাইপগুলি এই ফাংশনে পাঠানো যাবে, যেগুলোর মধ্যে length প্রপার্টি আছে (যেমন, স্ট্রিং বা অ্যারে)।

উপসংহার

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

Content added By

TypeScript-এ জেনেরিকস (Generics) একটি শক্তিশালী ফিচার যা কোডকে আরও পুনরায় ব্যবহারযোগ্য এবং টাইপ সেফ করে তোলে। এটি আপনাকে একটি ফাংশন, ক্লাস, অথবা ইন্টারফেস লিখতে দেয় যা বিভিন্ন টাইপের জন্য কাজ করতে পারে। তবে, কখনও কখনও আপনি চাইবেন যে জেনেরিক টাইপ কিছু নির্দিষ্ট কনস্ট্রেইন্ট (সংকোচন) অনুসরণ করুক, অর্থাৎ শুধুমাত্র নির্দিষ্ট টাইপগুলোই ব্যবহার করা যাবে। এর জন্য কনস্ট্রেইন্টস সহ জেনেরিকস ব্যবহার করা হয়।


১. জেনেরিকস কী?

জেনেরিকস টাইপকে ভ্যারিয়েবল হিসাবে ব্যবহার করতে সাহায্য করে। এর মাধ্যমে আপনি নির্দিষ্ট টাইপের পরিবর্তে টাইপ প্যারামিটার ব্যবহার করতে পারেন, যা পরে ফাংশন, ক্লাস, বা ইন্টারফেসের মাধ্যমে নির্দিষ্ট টাইপে রেজলভ (resolve) হবে।

উদাহরণ:

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

console.log(identity("Hello"));  // "Hello"
console.log(identity(42));       // 42

এখানে T একটি জেনেরিক টাইপ প্যারামিটার, এবং এটি string বা number টাইপের জন্য কাজ করতে পারে। এটি টাইপ সেফ এবং পুনঃব্যবহারযোগ্য।


২. কনস্ট্রেইন্টস সহ জেনেরিকস

কনস্ট্রেইন্টস সহ জেনেরিকস ব্যবহারের মাধ্যমে আপনি নির্দিষ্ট টাইপগুলোর মধ্যে সীমাবদ্ধ করতে পারেন, অর্থাৎ শুধুমাত্র কিছু নির্দিষ্ট টাইপই গ্রহণযোগ্য হবে। এর জন্য <T extends SomeType> সিনট্যাক্স ব্যবহার করা হয়, যেখানে T টাইপের কনস্ট্রেইন্ট থাকে SomeType এর উপরের।

উদাহরণ:

function getLength<T extends { length: number }>(item: T): number {
  return item.length;
}

console.log(getLength("Hello"));       // 5
console.log(getLength([1, 2, 3, 4]));  // 4

এখানে T extends { length: number } কনস্ট্রেইন্ট বলে দেয় যে T টাইপ এমন কিছু হতে হবে যেটির length প্রপার্টি রয়েছে এবং এটি একটি সংখ্যা (number) হতে হবে।

এই উদাহরণে, "Hello" একটি স্ট্রিং, এবং [1, 2, 3, 4] একটি অ্যারে, যা দুটিই length প্রপার্টি ধারণ করে, সুতরাং ফাংশনটি সঠিকভাবে কাজ করে। কিন্তু, যদি আপনি একটি টাইপ পাস করেন যেটির length প্রপার্টি না থাকে, তাহলে TypeScript ত্রুটি (error) দেখাবে।


৩. কনস্ট্রেইন্টস সহ জেনেরিক ক্লাস

আপনি ক্লাসেও কনস্ট্রেইন্টস সহ জেনেরিকস ব্যবহার করতে পারেন। এতে আপনি একটি ক্লাসের টাইপ প্যারামিটার কনস্ট্রেইন্ট করতে পারেন, যাতে শুধুমাত্র নির্দিষ্ট টাইপগুলো গ্রহণযোগ্য হয়।

উদাহরণ:

class Box<T extends number | string> {
  value: T;

  constructor(value: T) {
    this.value = value;
  }

  getValue(): T {
    return this.value;
  }
}

const numberBox = new Box(123);
console.log(numberBox.getValue());  // 123

const stringBox = new Box("Hello");
console.log(stringBox.getValue());  // "Hello"

const boolBox = new Box(true);  // Error: 'boolean' is not assignable to 'number | string'

এখানে Box ক্লাসের T টাইপ কনস্ট্রেইন্টে number | string দেওয়া হয়েছে, যার মানে Box ক্লাস শুধুমাত্র number অথবা string টাইপ গ্রহণ করবে। অন্য টাইপ পাস করলে টাইপ ত্রুটি (type error) দেখাবে।


৪. কনস্ট্রেইন্টস সহ জেনেরিক ইন্টারফেস

এছাড়া, ইন্টারফেস (Interfaces) এর মাধ্যমে আপনি কনস্ট্রেইন্টস সহ জেনেরিকস ব্যবহার করতে পারেন। এটি বিশেষত যখন আপনি টাইপের কাঠামো (structure) নির্দিষ্ট করতে চান, তখন কার্যকর।

উদাহরণ:

interface Lengthwise {
  length: number;
}

function printLength<T extends Lengthwise>(item: T): void {
  console.log(item.length);
}

printLength("Hello");     // 5
printLength([1, 2, 3]);    // 3

printLength(123);          // Error: Argument of type 'number' is not assignable to parameter of type 'Lengthwise'.

এখানে T extends Lengthwise কনস্ট্রেইন্ট নিশ্চিত করে যে শুধুমাত্র সেই সব টাইপ গ্রহণ করা হবে যেগুলোর length প্রপার্টি রয়েছে।


৫. কনস্ট্রেইন্টস সহ মাল্টিপল টাইপস

TypeScript-এ আপনি একাধিক কনস্ট্রেইন্টও ব্যবহার করতে পারেন, যা একটি টাইপের জন্য একাধিক শর্ত বা সীমাবদ্ধতা নির্ধারণ করে।

উদাহরণ:

function merge<T extends { name: string }, U extends { age: number }>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

const result = merge({ name: "John" }, { age: 30 });
console.log(result);  // { name: "John", age: 30 }

এখানে T এবং U দুইটি কনস্ট্রেইন্ট প্যারামিটার রয়েছে:

  • T এর মধ্যে name: string থাকতে হবে
  • U এর মধ্যে age: number থাকতে হবে

ফলস্বরূপ, আমরা একটি নতুন অবজেক্ট পাচ্ছি যা উভয় টাইপের প্রপার্টি ধারণ করে।


সারাংশ

  • জেনেরিকস আপনাকে টাইপ প্যারামিটার ব্যবহার করার মাধ্যমে টাইপগুলিকে আরও ডাইনামিক এবং পুনঃব্যবহারযোগ্য করতে সাহায্য করে।
  • কনস্ট্রেইন্টস সহ জেনেরিকস এর মাধ্যমে আপনি টাইপ প্যারামিটারের জন্য কিছু নির্দিষ্ট সীমাবদ্ধতা বা শর্ত নির্ধারণ করতে পারেন।
  • TypeScript এর কনস্ট্রেইন্টস সহ জেনেরিকস ব্যবহারের মাধ্যমে টাইপ সেফ কোড লেখা সহজ হয় এবং কোডের রিফ্যাক্টরিং ও রক্ষণাবেক্ষণ সহজ হয়।

এই ফিচারটি TypeScript কোডে আরো শক্তিশালী টাইপ সিস্টেম বাস্তবায়ন করতে সহায়তা করে, যা বড় প্রজেক্টের ক্ষেত্রে খুবই কার্যকরী।

Content added By
Promotion

Are you sure to start over?

Loading...