5.5 এক্সেসর ডেকোরেটর্স
প্রথমে আমরা এক্সেসর কি এটা একটু দ্রুত রিভিউ করে নেই। এক্সেসর হচ্ছে বিশেষ মেথড যা ক্লাসকে সংজ্ঞায়িত করতে আর ক্লাস অ্যাক্সেস কনট্রোল করতে ব্যবহৃত হয়। টাইপস্ক্রিপ্টে দুইটা এক্সেসসর মেথড আছে যা হল সেটার (Setter) আর গেটার (Getter) যা দিয়ে আমরা ক্লাসকে অ্যাক্সেস আর সেট করতে পারি।
এক্সেসর ডিক্লারেশনের ঠিক আগে এক্সেসর ডেকোরেটরস ডিক্লেয়ার করা হয়।
এক্সেসর ডেকোরেটর, মেথড ডেকোরেটরের মতই কিন্তু সেটার (Setter) আর গেটার (Getter) মেথডের যেকোনো একটায় প্রয়োগ করা হয়। একটা সিঙ্গেল মেম্বারের ক্ষেত্রে দুইটা ডেকোরেটর আমরা একসাথে ব্যবহার করতে পারব না । বরং, মেম্বারটির সব ডেকোরেটরগুলো ডকুমেন্ট অর্ডারের প্রথম এক্সেসরে প্রয়োগ করতে হবে।
এক্সেসর ডেকোরেটরের এক্সপ্রেশনটি একটি ফাংশন হিসেবে রানটাইমে কল হয় এবং এতে তিনটা আর্গুমেন্ট থাকবে।
১। target: স্ট্যাটিক মেম্বারের ক্ষেত্রে ক্লাসটির কন্সট্রাকটর ফাংশন অথবা ইনস্ট্যান্স মেম্বারের ক্ষেত্রে ক্লাসটির প্রটোটাইপ
২। propertyKey: মেম্বারটির নাম
৩। descriptor: মেম্বারটির প্রোপার্টি ডেস্ক্রিপ্টর
নোট – যদি আপনার স্ক্রিপ্ট টার্গেট ES5 – এর নিচে হয়, তাহলে প্রোপার্টি ডেস্ক্রিপ্টর আনডিফাইনড হবে।
এক্সেসর ডেকোরেটর যদি কোনো ভ্যালু রিটার্ন করে, সেটা মেম্বারটির প্রোপার্টি ডেস্ক্রিপ্টর হিসেবে ব্যবহৃত হবে।
নোট – যদি আপনার স্ক্রিপ্ট টার্গেট ES5 এর নিচে হয়, রিটার্ন ভ্যালুটি উপেক্ষা করা হবে।
নিচের উদাহরণ কোডটি লক্ষ্য করি –
class Point {
private _x: number;
private _y: number;
constructor(x: number, y: number) {
this._x = x;
this._y = y;
}
@readonly
get x() {
return this._x;
}
@readonly
get y() {
return this._y;
}
}
function readonly(target: any, propertyKey: string) {
const descriptor: PropertyDescriptor = {
writable: false,
};
Object.defineProperty(target, propertyKey, descriptor);
}
const point = new Point(4, 5);
console.log(point.x); // Output: 4
point.x = 5; // This will throw an error
এই উদাহরণে ডেকোরেটর @readonly Point ক্লাসের মেম্বারের উপর প্রয়োগ করা হয়েছে যা প্রোপার্টিকে রিড-অনলি করে দিচ্ছে। ডেকোরেটরটি যখন এক্সেসর গেটার (Getter) – এ প্রয়োগ করা হল, এটা প্রোপার্টি ডেস্ক্রিপ্টরকে পরিবর্তন করে নন-রাইটেবল করে দিল।