十五、装饰器与反射元数据
1. 介绍
在过去的几年中,JavaScript及其生态系统发生了快速的变化。其中,TypeScript已成为许多开发人员的首选语言。其主要优势在于其静态类型系统,它使我们可以在编译时捕获错误,而不是在运行时。除此之外,TypeScript还为我们提供了许多ES6+特性以及一些其他的独有特性,例如枚举、命名空间和装饰器。
2. 装饰器简介
在TypeScript中,装饰器是一种特殊类型的声明,可以被附加到类声明,方法,属性,访问器或参数上。装饰器的核心思想是增强已经存在的类、方法、属性等的行为,或者添加新的行为。通过装饰器,我们可以在不改变原始类的定义的情况下,为类添加新的特性。
在TypeScript中,装饰器使用@expression的形式。其中,expression必须为一个返回函数的表达式,这个函数在运行时会被调用,传入相关的装饰器参数。
TypeScript支持以下几种类型的装饰器:
- 类装饰器
- 方法装饰器
- 访问器装饰器
- 属性装饰器
- 参数装饰器
3. 类装饰器
类装饰器应用于类的构造函数,用于观察、修改或替换类定义。类装饰器在应用时,会作为函数调用,并将构造函数作为其唯一的参数。
function Sealed(constructor: Function) { Object.seal(constructor); Object.seal(constructor.prototype);} @Sealedclass Greeter { constructor(public greeting: string) {} greet() { return "Hello, " + this.greeting; }}
4. 方法装饰器
方法装饰器应用于方法的属性描述符,并可以用于观察、修改或替换方法定义。当装饰器被调用时,它会接收到三个参数:当前类的原型,方法名,以及该方法的属性描述符。
function Log(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor) { let originalMethod = descriptor.value; // 保存原始函数 descriptor.value = function (...args: any[]) { console.log("Arguments: ", JSON.stringify(args)); let result = originalMethod.apply(this, args); console.log("Result: ", result); return result; }} class Calculator { @Log add(x: number, y: number): number { return x + y; }}
带你读《现代TypeScript高级教程》十五、装饰器与反射元数据(2)https://developer.aliyun.com/article/1348444?groupCode=tech_library