返回

深入探索 TypeScript 中装饰器的多面应用

前端

类修饰器:赋予类以独特气质

类修饰器可谓装饰器家族中最具影响力的成员之一。它能够在类声明之前添加额外的功能或属性,为类本身赋予独一无二的个性。

// 定义一个类修饰器
function Logger(target: any) {
  console.log(`Class ${target.name} is being created!`);
}

// 使用类修饰器修饰类
@Logger
class MyClass {
  // ...
}

// 输出:Class MyClass is being created!

属性修饰器:洞察对象内部细节

属性修饰器则允许您在属性声明之前添加一些额外的行为或逻辑。这为深入洞察对象内部提供了极大的便利。

// 定义一个属性修饰器
function Required(target: any, propertyKey: string) {
  console.log(`Property ${propertyKey} is required!`);
}

// 使用属性修饰器修饰属性
class Person {
  @Required
  name: string;

  // ...
}

// 输出:Property name is required!

方法修饰器:掌控方法的执行细节

方法修饰器则可以对方法的执行进行控制和增强。无论是记录方法执行时间,还是限制方法执行次数,方法修饰器都能胜任。

// 定义一个方法修饰器
function LogExecutionTime(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function(...args: any[]) {
    const start = performance.now();

    const result = originalMethod.apply(this, args);

    const end = performance.now();

    console.log(`Method ${propertyKey} executed in ${end - start}ms`);

    return result;
  };
}

// 使用方法修饰器修饰方法
class Stopwatch {
  @LogExecutionTime
  start() {
    // ...
  }

  // ...
}

// 输出:Method start executed in 100ms

参数修饰器:为参数锦上添花

参数修饰器则让您能够对方法参数进行修饰,从而实现更加细粒度的代码控制。

// 定义一个参数修饰器
function MinLength(minLength: number) {
  return function(target: any, propertyKey: string, parameterIndex: number) {
    console.log(`Parameter at index ${parameterIndex} of method ${propertyKey} must have a minimum length of ${minLength}`);
  };
}

// 使用参数修饰器修饰参数
class Validator {
  validate(@MinLength(5) input: string) {
    // ...
  }

  // ...
}

// 输出:Parameter at index 0 of method validate must have a minimum length of 5

TypeScript 中的装饰器绝不仅仅局限于上述示例,其应用场景可谓无穷无尽。它们如同乐高积木一般,让开发人员能够轻松地扩展和重用代码,构建更加灵活且可维护的软件系统。