面试题答案
一键面试TypeScript装饰器基本概念
- 定义:装饰器是一种特殊类型的声明,它能够被附加到类声明、方法、属性或参数上,用于对这些目标进行注解和元编程。它本质上是一个函数,该函数可以在运行时修改类的行为或添加额外的功能。
- 语法:装饰器使用
@expression
的形式,其中expression
必须是一个返回函数的表达式,这个返回的函数会在运行时被调用,并且传入目标(类、方法等)相关的参数。
使用场景
- 日志记录:可以在方法执行前后添加日志记录,记录方法的调用信息。
- 权限控制:通过装饰器检查用户权限,决定是否允许执行某个方法。
- 依赖注入:在类实例化时,自动注入依赖项。
使用Reflect Metadata在装饰器中添加和读取元数据
- 安装依赖:首先需要安装
reflect - metadata
库,因为TypeScript默认没有内置对元数据操作的支持。在项目根目录执行npm install reflect - metadata
。 - 引入库:在代码文件顶部引入
reflect - metadata
。import 'reflect - metadata';
- 添加元数据:
import 'reflect - metadata';
const metadataKey = Symbol('metadata');
function addMetadata(target: any, propertyKey: string) {
Reflect.defineMetadata(metadataKey, 'This is metadata', target, propertyKey);
}
class MyClass {
@addMetadata
myMethod() {}
}
- 读取元数据:
import 'reflect - metadata';
const metadataKey = Symbol('metadata');
function addMetadata(target: any, propertyKey: string) {
Reflect.defineMetadata(metadataKey, 'This is metadata', target, propertyKey);
}
class MyClass {
@addMetadata
myMethod() {}
}
const metadata = Reflect.getMetadata(metadataKey, new MyClass(),'myMethod');
console.log(metadata);
上述代码中,首先定义了一个 Symbol
类型的元数据键 metadataKey
,addMetadata
装饰器使用 Reflect.defineMetadata
方法为 MyClass
类的 myMethod
方法添加元数据。之后通过 Reflect.getMetadata
方法读取该元数据并输出。