MST

星途 面试题库

面试题:TypeScript 装饰器基础与日志记录实现思路

请简述 TypeScript 装饰器的基本概念和类型。若要实现日志记录功能,从装饰器角度出发,应如何设计一个简单的装饰器结构?
11.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

TypeScript 装饰器基本概念

TypeScript 装饰器是一种特殊的声明,它能够附加到类声明、方法、访问器、属性或参数上,用于对这些目标进行元编程,添加额外的行为或修改它们的特性。

装饰器类型

  1. 类装饰器:应用于类的构造函数,可用于监视、修改或替换类定义。例如,可以修改类的原型,添加新的方法。
  2. 方法装饰器:应用于类的方法,能在方法定义时进行元编程操作,如修改方法的属性描述符,添加额外的逻辑。
  3. 访问器装饰器:应用于类的访问器(getter 或 setter),可用于修改访问器的属性描述符或添加额外逻辑。
  4. 属性装饰器:应用于类的属性,可用于在属性定义时添加元数据,比如标记属性的用途。
  5. 参数装饰器:应用于函数或方法的参数,可用于获取参数的元数据,如在方法调用前对参数进行验证。

实现日志记录功能的装饰器结构设计

// 方法装饰器实现日志记录
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args: any[]) {
        console.log(`调用方法 ${propertyKey},参数为:`, args);
        const result = originalMethod.apply(this, args);
        console.log(`方法 ${propertyKey} 执行完毕,返回结果:`, result);
        return result;
    };
    return descriptor;
}

class Example {
    @log
    add(a: number, b: number) {
        return a + b;
    }
}

const example = new Example();
example.add(1, 2);

在上述代码中,定义了一个 log 方法装饰器,它会在方法调用前后打印日志信息,记录方法名、参数以及返回结果。通过 @log 语法将装饰器应用到 Example 类的 add 方法上。