MST
星途 面试题库

面试题:TypeScript装饰器性能优化之缓存策略

假设你有一个频繁调用的TypeScript装饰器,该装饰器用于在方法执行前后添加日志记录。请设计一种基于缓存的优化策略,以减少该装饰器对性能的影响,并写出关键代码示例。
23.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 优化思路
    • 对于频繁调用的装饰器,缓存装饰后的函数结果。如果相同的参数组合被再次调用,直接返回缓存中的结果,而不是重新执行被装饰的函数并记录日志。
  2. 关键代码示例
// 用于缓存结果的Map
const cache: Map<string, any> = new Map();

// 定义日志装饰器
function logDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args: any[]) {
        const key = `${propertyKey}:${args.join(',')}`;
        if (cache.has(key)) {
            console.log(`从缓存中获取结果: ${cache.get(key)}`);
            return cache.get(key);
        }
        console.log(`开始执行方法 ${propertyKey}`);
        const result = originalMethod.apply(this, args);
        console.log(`方法 ${propertyKey} 执行结束`);
        cache.set(key, result);
        return result;
    };
    return descriptor;
}

class MyClass {
    @logDecorator
    myMethod(a: number, b: number) {
        return a + b;
    }
}

const myObj = new MyClass();
console.log(myObj.myMethod(1, 2));
console.log(myObj.myMethod(1, 2));

上述代码定义了一个日志装饰器logDecorator,它在方法执行前后添加日志记录,并通过Map来缓存方法的执行结果。当相同参数的方法被再次调用时,直接从缓存中返回结果,减少了方法执行和日志记录的开销。