5.6 প্রপার্টি ডেকোরেটর্স
টাইপস্ক্রিপ্টে একটা প্রপার্টি একটা ক্লাস বা ইন্টারফেসের মেম্বারকে রেফার করে যা একটা অবজেক্টের ভ্যালু বা বৈশিষ্ট্যকে প্রতিনিধিত্ত্ব করে।
প্রোপার্টি ডেস্ক্রিপ্টর আমাদের একটি ক্লাসের প্রোপার্টিগুলোর আচরণ পরিবর্তন করতে সাহায্য করে। প্রোপার্টি ডেস্ক্রিপ্টরের এক্সপ্রেশনটি একটি ফাংশন হিসেবে রানটাইমে কল হয় এবং এতে দুইটা আর্গুমেন্ট থাকবে।
১। target: স্ট্যাটিক মেম্বারের ক্ষেত্রে ক্লাসটির কন্সট্রাক্টর ফাংশন অথবা ইনস্ট্যান্স মেম্বারের ক্ষেত্রে ক্লাসটির প্রটোটাইপ
২। propertyKey: মেম্বারটির নাম
function replaceSpace(target: any, key: string) {
let value =target[key] ;
const getter = function () {
console.log(`Get value: ${value}`);
return value.replace(/\s/g, "");
};
const setter = function (newValue: string) {
value = newValue.replace(/\s/g, "");
};
Object.defineProperty(target, key, {
get: getter,
set: setter,
enumerable: true,
configurable: true,
});
}
class PropertyDecoratorExample {
@replaceSpace
public myText: string;
constructor() {
this.myText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit";
}
}
const example = new PropertyDecoratorExample();
console.log(example.myText);
example.myText = "sed do eiusmod tempor incididunt ut labore et dolore magna";
console.log(example.myText);
আউটপুট:
Loremipsumdolorsitametconsecteturadipiscingelit
seddoeiusmodtemporincididuntutlaboreetdoloremagna
এই উদাহরণে আমরা একটা প্রোপার্টি ডেকোরেটর বানালাম যা হল replaceSpace এটা দিয়ে যেই স্ট্রিং প্রোপার্টিকে আমরা ডেকোরেট করব সেই স্ট্রিং-এর সব whitespace রিপ্লেস করে দিবে। Object.defineProperty স্ট্যাটিক মেথডটি সরাসরি অবজেক্টের উপর একটা নতুন প্রোপার্টি ডিফাইন করে অথবা অবজেক্টের বর্তমান প্রোপার্টিকে পরিবর্তন করে অবজেক্টটি রিটার্ন করে।
const propertyDecorator = (target: any, propertyName: string) => {
let currentNumber: number = target[propertyName];
Object.defineProperty(target, propertyName, {
set: (newNumber: number) => {
if (newNumber < 100) {
console.log("Number should be greater than or equal to 100");
return;
}
currentNumber = newNumber;
},
get: () => currentNumber,
});
};
export class PropertyDecoratorExample {
@propertyDecorator
public myNumber: number;
constructor() {
this.myNumber = 16;
}
}
const example = new PropertyDecoratorExample();
console.log(example.myNumber);
example.myNumber = 100;
console.log(example.myNumber);
আউটপুট:
Number should be greater than or equal to 100
undefined
100
উপরের উদাহরণে আমরা myNumber প্রোপার্টিকে ১০০ এর কম হতে দিচ্ছি না।