// 在TypeScript中使用装饰器来增强代码的功能和可维护性已经成为一种常见的实践。装饰器可以帮助我们在不修改原有代码的情况下,对其进行扩展和修改。

// 1. 在装饰器函数前面添加@符号,表示该函数是一个装饰器。
// 2. 装饰器函数接收一个参数,作为要装饰的目标函数或类。
// 3. 装饰器函数可以返回一个新的函数或类,或者修改目标函数或类的行为。
// 4. 装饰器函数可以在目标函数或类的声明之前和之后执行。

// 以下是一个使用装饰器增强日志功能的示例:

function log(target: any, key: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`调用方法 ${key} 参数: ${JSON.stringify(args)}`);
    const result = originalMethod.apply(this, args);
    console.log(`方法 ${key} 返回值: ${JSON.stringify(result)}`);
    return result;
  };
  return descriptor;
}

class Calculator {
  @log
  add(a: number, b: number) {
    return a + b;
  }
}

const calculator = new Calculator();
console.log(calculator.add(2, 3)); // 输出: 调用方法 add 参数: [2,3],方法 add 返回值: 5

// 在上述示例中,通过在add方法前使用装饰器@log,我们可以在方法调用前后打印出参数和返回值,从而方便调试和追踪错误。

// 使用装饰器的好处不仅仅是增强功能和可维护性,还可以提高代码的可读性和重用性。同时,装饰器还可以与其他设计模式和编程范式结合使用,从而进一步提升代码质量。

// 值得注意的是,装饰器是一种实验性的特性,在某些情况下可能会有一些限制和局限性。因此,在使用装饰器时,我们需要谨慎考虑其适用性和潜在的风险。