相关文章
装饰器常用方法
一、类装饰器(Class Decorator)
类装饰器用于修饰类,可以在类的声明前面使用 @ 符号来应用。类装饰器接受一个参数,即目标类的构造函数,可以用来扩展或修改类的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13
| function logClass(target) { target.prototype.logger = function () { console.log("Logging..."); } }
@logClass class MyClass { }
const obj = new MyClass(); obj.logger();
|
二、方法装饰器(Method Decorator)
方法装饰器用于修饰类的方法,可以在方法的声明前面使用 @ 符号来应用。方法装饰器接受三个参数:目标类的原型对象、属性名、属性描述符,可以用来扩展或修改方法的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function logMethod(target, key, descriptor) { const originalMethod = descriptor.value; descriptor.value = function (...args) { console.log(`Calling method ${key} with arguments: ${args}`); return originalMethod.apply(this, args); }; return descriptor; }
class MyClass { @logMethod greet(name) { return `Hello, ${name}!`; } }
const obj = new MyClass(); console.log(obj.greet("Alice"));
|
三、属性装饰器(Property Decorator)
属性装饰器用于修饰类的属性,可以在属性的声明前面使用 @ 符号来应用。属性装饰器接受两个参数:目标类的原型对象和属性名,可以用来扩展或修改属性的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13
| function readonly(target, key) { Object.defineProperty(target, key, { writable: false }); }
class MyClass { @readonly PI = 3.14159; }
const obj = new MyClass(); obj.PI = 3.14;
|
四、参数装饰器(Parameter Decorator)
参数装饰器用于修饰类的参数,在参数声明前面使用 @ 符号来应用。参数装饰器接受三个参数:目标类的原型对象、方法名(或构造函数名)、参数在函数参数列表中的索引,可以用来扩展或修改参数的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function logParameter(target, key, index) { console.log(`Parameter ${index} of method ${key} has been decorated`); }
class MyClass { greet(@logParameter name) { console.log(`Hello, ${name}!`); } }
const obj = new MyClass(); obj.greet("Alice");
|
五、装饰器组合
装饰器可以组合使用,多个装饰器按照从上到下的顺序依次执行。示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function decorator1(target: any, propertyKey: string) { }
function decorator2(target: any, propertyKey: string) { }
class MyClass { @decorator1 @decorator2 myMethod() { } }
|
在这个示例中,myMethod 方法同时应用了两个装饰器 decorator1 和 decorator2,它们将按照从上到下的顺序依次执行。
四、六置装饰器
TypeScript 提供了一些内置的装饰器,用于对类、方法等进行装饰。常见的内置装饰器包括 @deprecated、@experimental、@sealed 等,它们用于标记类、方法等的状态或用途。
@deprecated: 标记为过时
@deprecated 装饰器用于标记某个类、方法或属性已经被废弃,不推荐再使用。当我们在代码中使用了被 @deprecated 标记的成员时,编译器会发出警告,提醒开发者不要使用该成员。
@experimental: 标记为实验性的
@experimental 装饰器用于标记某个类、方法或属性是实验性的,可能在未来版本中发生变化。当我们在代码中使用了被 @experimental 标记的成员时,开发者应该注意这是一个实验性的特性,可能会有不稳定或不完善的地方。
@sealed: 标记为密封的
@sealed 装饰器用于标记某个类是密封的,即不能被继承。当我们在代码中使用了被 @sealed 标记的类时,编译器会阻止该类被其他类继承。
七、应用场景
装饰器在 TypeScript 中的应用场景包括但不限于:
- 添加日志、性能监控等代码。
- 实现依赖注入。
- 添加验证逻辑。
- 实现权限控制。
- 实现缓存策略等。