装饰器
类装饰器(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 访问器,参数与方法装饰器相同,但不能同时装饰一个访问器的 get 和 set,需装饰在第一个访问器上。
属性装饰器(Property Decorators)
作用于类的属性,接收 2 个参数:
target: 对于静态方法是类本身,对于实例方法是类的原型对象。propertyKey:方法名(字符串或 symbool)
属性装饰器无法直接修改属性的定义(因无 descriptor 参数),通常需结合元数据(如 reflect-metadata)使用。
参数装饰器(Parameter Decorators)
作用于方法的参数,接收 3 个参数:
target:同方法装饰器。propertyKey:方法名。parameterIndex:参数在方法参数列表中的索引(从 0 开始)。
通常用于记录参数元数据(如依赖注入标记)。
装饰器的执行顺序
当多个装饰器作用于同一目标时,执行顺序遵循从内到外、从下到上:
同一行的装饰器:从右到左执行。
不同行的装饰器:从上到下定义,从下到上执行。
不同类型装饰器的执行顺序:参数装饰器 → 方法 / 访问器 / 属性装饰器 → 类装饰器
装饰器工厂(Decorator Factories)
装饰器工厂是一个返回装饰器函数的函数,用于为装饰器传递参数(解决装饰器本身无法直接接收参数的问题)。
最后更新于
这有帮助吗?