MST

星途 面试题库

面试题:TypeScript类的元编程与装饰器高级应用

编写一个TypeScript装饰器,用于记录类方法的调用次数,并在每次调用时将调用信息(方法名、调用时间等)记录到控制台。要求该装饰器可以应用于类的多个方法,且在类的实例化和方法调用过程中保持正确的功能。请给出完整的代码实现,并解释装饰器的工作原理。
18.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义装饰器
function logCallCount(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;
    let callCount = 0;
    descriptor.value = function(...args: any[]) {
        callCount++;
        const callTime = new Date();
        console.log(`Method ${propertyKey} called at ${callTime.toISOString()}, call count: ${callCount}`);
        return originalMethod.apply(this, args);
    };
    return descriptor;
}

// 使用装饰器的类
class MyClass {
    @logCallCount
    myMethod() {
        console.log('Inside myMethod');
    }
}

// 测试
const myObj = new MyClass();
myObj.myMethod();
myObj.myMethod();

装饰器工作原理解释

  1. 定义装饰器函数logCallCount 是一个装饰器函数,它接收三个参数 target(类的原型对象),propertyKey(方法名),descriptor(包含方法的属性描述符)。
  2. 保存原始方法const originalMethod = descriptor.value; 保存原始的方法,以便之后调用。
  3. 定义新的方法descriptor.value 被重新赋值为一个新的函数。在这个新函数中,首先增加调用次数 callCount,然后记录调用时间 callTime,并将调用信息打印到控制台。最后,通过 originalMethod.apply(this, args) 调用原始方法,并返回其执行结果。
  4. 返回修改后的描述符:返回修改后的 descriptor,这样类的方法就被替换为新的带有调用记录功能的方法。
  5. 使用装饰器:在 MyClass 类的 myMethod 方法上使用 @logCallCount 装饰器,这样当 myMethod 方法被调用时,装饰器就会生效。每次调用 myMethod 都会记录调用次数和调用时间并打印到控制台。