MST

星途 面试题库

面试题:TypeScript装饰器与Reflect Metadata基础使用

请简述TypeScript装饰器的基本概念和使用场景,并举例说明如何使用Reflect Metadata在装饰器中添加和读取元数据。
20.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

TypeScript装饰器基本概念

  1. 定义:装饰器是一种特殊类型的声明,它能够被附加到类声明、方法、属性或参数上,用于对这些目标进行注解和元编程。它本质上是一个函数,该函数可以在运行时修改类的行为或添加额外的功能。
  2. 语法:装饰器使用 @expression 的形式,其中 expression 必须是一个返回函数的表达式,这个返回的函数会在运行时被调用,并且传入目标(类、方法等)相关的参数。

使用场景

  1. 日志记录:可以在方法执行前后添加日志记录,记录方法的调用信息。
  2. 权限控制:通过装饰器检查用户权限,决定是否允许执行某个方法。
  3. 依赖注入:在类实例化时,自动注入依赖项。

使用Reflect Metadata在装饰器中添加和读取元数据

  1. 安装依赖:首先需要安装 reflect - metadata 库,因为TypeScript默认没有内置对元数据操作的支持。在项目根目录执行 npm install reflect - metadata
  2. 引入库:在代码文件顶部引入 reflect - metadataimport 'reflect - metadata';
  3. 添加元数据
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() {}
}
  1. 读取元数据
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 类型的元数据键 metadataKeyaddMetadata 装饰器使用 Reflect.defineMetadata 方法为 MyClass 类的 myMethod 方法添加元数据。之后通过 Reflect.getMetadata 方法读取该元数据并输出。