MST

星途 面试题库

面试题:TypeScript方法装饰器中参数的作用

在TypeScript方法装饰器中,装饰器函数接收三个参数(target, propertyKey, descriptor),请分别阐述这三个参数的含义以及在实际应用中如何使用它们对类方法进行功能扩展。
22.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. target参数
    • 含义:对于静态方法,它是类的构造函数;对于实例方法,它是类的原型对象。
    • 实际应用:比如可以通过判断target是构造函数还是原型对象,来决定是否为静态方法或实例方法添加扩展逻辑。例如,记录方法调用的日志,若target是构造函数,说明是静态方法调用,可在日志中标记为静态方法相关日志。
  2. propertyKey参数
    • 含义:被装饰方法的名称。
    • 实际应用:可根据方法名实现不同的扩展逻辑。例如,对特定名称的方法进行权限验证,如只有名为adminOnlyMethod的方法需要进行管理员权限验证。
  3. descriptor参数
    • 含义:包含被装饰方法的属性描述符,如value(方法的实际函数体)、writable(是否可写)、enumerable(是否可枚举)、configurable(是否可配置)等属性。
    • 实际应用:可以通过修改descriptor的属性来扩展方法功能。比如,在不改变原方法逻辑的情况下,通过修改value属性,在原方法前后添加额外逻辑,如在方法执行前检查参数合法性,在方法执行后记录执行时间。示例代码如下:
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();

在上述代码中,通过descriptor.value修改了原方法,在其前后添加了日志记录功能。