TypeScript Metadata Reflection API একটি বিশেষ ফিচার যা ক্লাস, প্রোপার্টি, মেথড এবং প্যারামিটার সম্পর্কিত মেটাডেটা (অর্থাৎ, টাইপ সম্পর্কিত তথ্য) সংগ্রহ এবং ব্যবহারের সুবিধা দেয়। এটি TypeScript প্রোগ্রামিংয়ে রিফ্লেকশন (Reflection) এর মাধ্যমে মেটাডেটা এক্সেস করতে এবং কোডের আচরণ বা কাঠামো প্রোগ্রাম্যাটিকভাবে পরিবর্তন করতে ব্যবহৃত হয়।
১. Metadata Reflection API এর পরিচিতি
TypeScript মেটাডেটা রিফ্লেকশন সাধারণত ডেকোরেটর এবং রিফ্লেকশন ব্যবহার করে, যা মেটাডেটা সংগ্রহ এবং সংরক্ষণ করার জন্য বিশেষ কৌশল সরবরাহ করে। reflect-metadata লাইব্রেরিটি TypeScript-এ রিফ্লেকশন কার্যকলাপ পরিচালনার জন্য ব্যবহৃত হয়। এটি ES7 বা TypeScript ডেকোরেটর সমর্থন করে এবং টাইপ মেটাডেটার সঙ্গে ইন্টারঅ্যাকশন করার জন্য প্রয়োজনীয় ফিচারগুলো প্রদান করে।
TypeScript এ মেটাডেটা রিফ্লেকশন ব্যবহার করতে হলে reflect-metadata প্যাকেজটি ইনস্টল করা প্রয়োজন।
reflect-metadata ইনস্টল করা
npm install reflect-metadata
এছাড়া, TypeScript কনফিগারেশন ফাইলে experimentalDecorators এবং emitDecoratorMetadata অপশনগুলো সক্ষম করতে হবে।
tsconfig.json উদাহরণ:
{
"compilerOptions": {
"experimentalDecorators": true,
"emitDecoratorMetadata": true
}
}
২. Metadata Reflection API এর মূল ফাংশন
TypeScript এ মেটাডেটা রিফ্লেকশন করার জন্য কিছু প্রধান ফাংশন ব্যবহার করা হয়:
Reflect.metadata(metadataKey, metadataValue)– ডেকোরেটরের মাধ্যমে মেটাডেটা সেট করা।Reflect.getMetadata(metadataKey, target, targetKey)– মেটাডেটা রিড করা।Reflect.hasMetadata(metadataKey, target, targetKey)– মেটাডেটা উপস্থিতি চেক করা।
৩. উদাহরণ: মেটাডেটা রিফ্লেকশন
৩.১. ডেকোরেটর ব্যবহার করে মেটাডেটা সেট করা
প্রথমে, আপনি @Reflect.metadata ডেকোরেটর ব্যবহার করে মেটাডেটা সংরক্ষণ করতে পারেন।
import "reflect-metadata";
function Role(role: string) {
return function(target: any, key: string | symbol) {
Reflect.metadata("role", role)(target, key);
};
}
class User {
@Role("admin")
name: string;
constructor(name: string) {
this.name = name;
}
}
এখানে:
Roleডেকোরেটরটিnameপ্রোপার্টির জন্য মেটাডেটা হিসেবে"admin"সংরক্ষণ করছে।
৩.২. মেটাডেটা এক্সেস করা
মেটাডেটা সেট করার পর, আপনি Reflect.getMetadata ফাংশন ব্যবহার করে সেটি রিড করতে পারেন।
const user = new User("Alice");
// মেটাডেটা রিড করা
const role = Reflect.getMetadata("role", user, "name");
console.log(role); // Output: admin
এখানে:
Reflect.getMetadataব্যবহার করেnameপ্রোপার্টির জন্য সংরক্ষিত"role"মেটাডেটা রিড করা হচ্ছে এবং এটি"admin"রিটার্ন করছে।
৪. মেটাডেটা রিফ্লেকশন দিয়ে ক্লাসের তথ্য সংগ্রহ
আপনি পুরো ক্লাসের জন্যও মেটাডেটা সংগ্রহ করতে পারেন, যেমন কোন প্রোপার্টি বা মেথডে ডেকোরেটর অ্যাপ্লাই করা হয়েছে।
উদাহরণ: মেথড এবং প্যারামিটার মেটাডেটা
import "reflect-metadata";
function Log(target: any, key: string, descriptor: PropertyDescriptor) {
Reflect.metadata("log", "Logging Method")(target, key);
}
class Product {
@Log
calculatePrice(price: number): number {
return price * 1.2;
}
}
const product = new Product();
const logMetadata = Reflect.getMetadata("log", product, "calculatePrice");
console.log(logMetadata); // Output: Logging Method
এখানে:
LogডেকোরেটরটিcalculatePriceমেথডের জন্য মেটাডেটা হিসেবে"Logging Method"যোগ করছে।- পরে,
Reflect.getMetadataব্যবহার করে এই মেটাডেটা রিড করা হয়।
৫. Metadata Reflection API এর ব্যবহার
Metadata Reflection API সাধারণত ডাইনামিক ক্লাস কনফিগারেশন, ভ্যালিডেশন, ডেটাবেস ORM, ডিপেনডেন্সি ইনজেকশন এবং প্রপার্টি বা মেথডের আচরণ কাস্টমাইজ করতে ব্যবহৃত হয়।
উদাহরণ: ডিপেনডেন্সি ইনজেকশন
ডিপেনডেন্সি ইনজেকশন বা DI সিস্টেম তৈরি করতে মেটাডেটা রিফ্লেকশন ব্যবহার করা যায়। যেমন:
import "reflect-metadata";
class Service {
sayHello() {
console.log("Hello from Service!");
}
}
function Injectable(target: any) {
Reflect.defineMetadata("injectable", true, target);
}
@Injectable
class App {
constructor(private service: Service) {}
run() {
this.service.sayHello();
}
}
const app = new App(new Service());
app.run(); // Output: Hello from Service!
এখানে:
Injectableডেকোরেটরটি ক্লাসে মেটাডেটা সংরক্ষণ করছে এবং ডিপেনডেন্সি ইনজেকশন ব্যবস্থা তৈরি করা হচ্ছে।
TypeScript Metadata Reflection API ডেকোরেটর এবং রিফ্লেকশন ব্যবহার করে কোডের মেটাডেটা সংগ্রহ এবং পরিবর্তন করতে একটি শক্তিশালী পদ্ধতি প্রদান করে। এটি বিশেষভাবে অ্যাডভান্সড ফিচার এবং লাইব্রেরি তৈরি করার জন্য উপকারী, যেমন ডিপেনডেন্সি ইনজেকশন, ORM এবং ক্লাস লেভেল কনফিগারেশন।
Read more