Method Decorator - Logging
function Log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`Calling ${propertyKey} with:`, args);
const result = original.apply(this, args);
console.log(`Result:`, result);
return result;
};
return descriptor;
}
class Calculator {
@Log
add(a: number, b: number): number {
return a + b;
}
}Method Decorator - Memoize
function Memoize(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const cache = new Map<string, any>();
const original = descriptor.value;
descriptor.value = function (...args: any[]) {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = original.apply(this, args);
cache.set(key, result);
return result;
};
return descriptor;
}Class Decorator - Singleton
function Singleton<T extends new (...args: any[]) => any>(constructor: T) {
let instance: InstanceType<T>;
return class extends constructor {
constructor(...args: any[]) {
if (instance) return instance;
super(...args);
instance = this;
}
};
}
@Singleton
class Database {
connect() {
/* ... */
}
}



