装饰器

类装饰器(Class Decorators)

作用于类本身,接收类的构造函数作为唯一参数,可返回一个新类替换原来类。

🌰 示例:给类添加创建时间属性

function addCreateTime(constructor: Function) {
  constructor.prototype.createTime = new Date();
}

// 为 User 类扩展接口,声明 createTime 属性
interface User {
  createTime: Date;
}

@addCreateTime
class User {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}

const user = new User("Alice");
console.log(user.createTime); // 不再报错,类型为 Date

🌰 示例:返回新类的示例

方法装饰器(Method Decorators)

作用于类的方法,接收 3 个参数:

  • target: 对于静态方法是类本身,对于实例方法是类的原型对象。

  • propertyKey:方法名(字符串或 symbool)

  • descrpotr:方法的属性描述符(PropertyDescriptor

🌰 示例:可返回一个新的属性描述符替换原方法。

访问器装饰器(Accessor Decorators)

作用于类的 getter/setter 访问器,参数与方法装饰器相同,但不能同时装饰一个访问器的 getset,需装饰在第一个访问器上。

属性装饰器(Property Decorators)

作用于类的属性,接收 2 个参数:

  • target: 对于静态方法是类本身,对于实例方法是类的原型对象。

  • propertyKey:方法名(字符串或 symbool)

参数装饰器(Parameter Decorators)

作用于方法的参数,接收 3 个参数:

  • target:同方法装饰器。

  • propertyKey:方法名。

  • parameterIndex:参数在方法参数列表中的索引(从 0 开始)。

通常用于记录参数元数据(如依赖注入标记)。

装饰器的执行顺序

当多个装饰器作用于同一目标时,执行顺序遵循从内到外、从下到上

  • 同一行的装饰器:从右到左执行。

  • 不同行的装饰器:从上到下定义,从下到上执行。

不同类型装饰器的执行顺序:参数装饰器 → 方法 / 访问器 / 属性装饰器 → 类装饰器

装饰器工厂(Decorator Factories)

装饰器工厂是一个返回装饰器函数的函数,用于为装饰器传递参数(解决装饰器本身无法直接接收参数的问题)。

最后更新于

这有帮助吗?