TypeScript-এ ডেকোরেটরস এমন একটি ফিচার যা ক্লাস, মেথড, প্রোপার্টি, প্যারামিটার ইত্যাদির উপরে কাস্টম আচরণ যোগ করতে সাহায্য করে। এটি একটি বিশেষ ফাংশন যা নির্দিষ্ট উপাদানের আচরণ পরিবর্তন বা প্রসারিত করতে ব্যবহৃত হয়। TypeScript-এ কাস্টম ডেকোরেটরস তৈরি এবং ব্যবহার করা বেশ শক্তিশালী একটি কৌশল, যা আপনার কোডকে আরও নমনীয় এবং কার্যকরী করে তুলতে পারে।
১. ডেকোরেটরস কী?
ডেকোরেটরস হল এমন ফাংশন যা ক্লাস, মেথড, প্রোপার্টি বা প্যারামিটারগুলোর আচরণ পরিবর্তন করতে ব্যবহৃত হয়। ডেকোরেটরস মূলত মেটা-প্রোগ্রামিং এর একটি অংশ, যা আপনাকে কোডের আচরণ নিয়ন্ত্রণ এবং প্রসারিত করার সুযোগ দেয়। TypeScript-এ ডেকোরেটরস ES7 থেকে চালু করা হয়েছিল এবং এতে ক্লাস ডেকোরেটর, মেথড ডেকোরেটর, প্রপার্টি ডেকোরেটর এবং প্যারামিটার ডেকোরেটর অন্তর্ভুক্ত থাকে।
২. ডেকোরেটরস এর ধরন
TypeScript-এ চারটি প্রধান ধরনের ডেকোরেটরস রয়েছে:
- ক্লাস ডেকোরেটর (Class Decorators)
- মেথড ডেকোরেটর (Method Decorators)
- প্রপার্টি ডেকোরেটর (Property Decorators)
- প্যারামিটার ডেকোরেটর (Parameter Decorators)
৩. কাস্টম ডেকোরেটর তৈরি এবং ব্যবহারের নিয়ম
১. ক্লাস ডেকোরেটর
ক্লাস ডেকোরেটর একটি ফাংশন যা ক্লাসের উপরে প্রয়োগ করা হয়। এটি সাধারণত ক্লাসের আচরণ পরিবর্তন বা তার মেটাডেটা সংযুক্ত করার জন্য ব্যবহৃত হয়।
function logClass(target: Function) {
console.log(`Class created: ${target.name}`);
}
@logClass
class Person {
constructor(public name: string) {}
}
const person = new Person("John");
এখানে, logClass একটি ক্লাস ডেকোরেটর যা Person ক্লাসের ওপর প্রয়োগ করা হয়েছে। এটি ক্লাস তৈরি হওয়ার সময় ক্লাসের নাম লগ করবে।
২. মেথড ডেকোরেটর
মেথড ডেকোরেটর একটি ফাংশন যা ক্লাসের মেথডে ব্যবহৃত হয়। এটি মেথডের আচরণ পরিবর্তন বা তার লগিক যোগ করার জন্য ব্যবহৃত হতে পারে।
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Called method: ${propertyKey} with arguments: ${args}`);
return originalMethod.apply(this, args);
};
return descriptor;
}
class Calculator {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3); // এটি "Called method: add with arguments: [2, 3]" মুদ্রণ করবে।
এখানে, logMethod ডেকোরেটরটি add মেথডের উপরে প্রয়োগ করা হয়েছে। এটি মেথডের আর্গুমেন্ট এবং মেথড কল হওয়ার সময় লগ করবে।
৩. প্রপার্টি ডেকোরেটর
প্রপার্টি ডেকোরেটর ক্লাসের প্রপার্টি বা ফিল্ডের উপর প্রয়োগ করা হয়। এটি প্রপার্টির সেটার এবং গেটারের আচরণ পরিবর্তন করতে ব্যবহৃত হয়।
function logProperty(target: any, propertyKey: string) {
let value = target[propertyKey];
const getter = () => {
console.log(`Getting value of ${propertyKey}: ${value}`);
return value;
};
const setter = (newValue: any) => {
console.log(`Setting value of ${propertyKey}: ${newValue}`);
value = newValue;
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
});
}
class Person {
@logProperty
name: string;
constructor(name: string) {
this.name = name;
}
}
const person = new Person("John");
person.name = "Alice"; // এটি "Setting value of name: Alice" মুদ্রণ করবে।
console.log(person.name); // এটি "Getting value of name: Alice" মুদ্রণ করবে।
এখানে, logProperty ডেকোরেটরটি name প্রপার্টির জন্য একটি কাস্টম গেটার এবং সেটার তৈরি করেছে।
৪. প্যারামিটার ডেকোরেটর
প্যারামিটার ডেকোরেটর একটি ফাংশন যা ক্লাসের মেথডের প্যারামিটারগুলোর ওপর প্রয়োগ করা হয়। এটি প্যারামিটার সম্পর্কিত মেটাডেটা যোগ করার জন্য ব্যবহার করা হয়।
function logParameter(target: any, methodName: string, parameterIndex: number) {
console.log(`Parameter at index ${parameterIndex} in method ${methodName} is being logged.`);
}
class Person {
greet(@logParameter message: string) {
console.log(message);
}
}
const person = new Person();
person.greet("Hello, World!");
এখানে, logParameter ডেকোরেটরটি greet মেথডের প্যারামিটার message এর ওপর প্রয়োগ করা হয়েছে। এটি প্যারামিটার ইনডেক্স লগ করবে।
৪. ডেকোরেটর ব্যবহার করার নিয়মাবলী
- ডেকোরেটরগুলি শুধুমাত্র ক্লাস, মেথড, প্রপার্টি এবং প্যারামিটারগুলোর উপর প্রয়োগ করা যায়।
- ডেকোরেটরসকে টাইপস্ক্রিপ্ট কম্পাইলারের
experimentalDecoratorsঅপশন চালু করার মাধ্যমে সক্রিয় করতে হয়। এর জন্যtsconfig.jsonফাইলে নিচের কনফিগারেশনটি রাখতে হবে:
{
"compilerOptions": {
"experimentalDecorators": true
}
}
TypeScript-এ কাস্টম ডেকোরেটরস তৈরি এবং ব্যবহার করা কোডের পুনঃব্যবহারযোগ্যতা এবং স্বচ্ছতা বাড়াতে সাহায্য করে। এটি মেটা-প্রোগ্রামিংয়ের একটি শক্তিশালী টুল, যা ক্লাসের আচরণ কাস্টমাইজ করার জন্য খুবই উপকারী। তবে, এর ব্যবহার সঠিকভাবে কনফিগার করতে হয় এবং TypeScript-এ এর সঠিক সমর্থন থাকতে হবে।
Read more