MST

星途 面试题库

面试题:TypeScript装饰器在类方法上的应用原理及示例

请解释TypeScript装饰器应用在类方法上的原理,并给出一个实际的代码示例,说明如何使用装饰器来修改类方法的行为,比如在方法执行前后添加日志输出。
33.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

原理

TypeScript装饰器本质上是一个函数,它可以在类定义、属性、方法或参数定义阶段对其进行修改或增强。当装饰器应用在类方法上时,它会在运行时被调用,传入目标类的原型对象、方法名以及一个描述符对象。通过操作这个描述符对象,可以修改方法的行为,比如重写方法的执行逻辑。

代码示例

// 定义一个装饰器函数
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args: any[]) {
        console.log(`调用方法 ${propertyKey} 前`);
        const result = originalMethod.apply(this, args);
        console.log(`调用方法 ${propertyKey} 后`);
        return result;
    };
    return descriptor;
}

class MyClass {
    @logMethod
    myMethod() {
        console.log('执行 myMethod');
    }
}

const myObj = new MyClass();
myObj.myMethod();

在上述代码中,logMethod 是一个装饰器函数,它接收目标类的原型对象 target、方法名 propertyKey 和描述符对象 descriptor。在装饰器函数内部,保存了原始方法 originalMethod,然后重写了 descriptor.value,在调用原始方法前后添加了日志输出。在 MyClass 类中,myMethod 方法应用了 logMethod 装饰器,这样每次调用 myMethod 时,都会在方法执行前后输出日志。