MST
星途 面试题库

面试题:TypeScript类继承中的复杂场景与元编程

假设你有一个基础类`BaseClass`,它有若干属性和方法。现在需要创建多个子类继承自`BaseClass`,并且在子类实例化时,能够根据传入的不同配置动态地修改或扩展父类的行为(例如增加新的方法、修改现有方法的逻辑等)。请使用TypeScript结合元编程(装饰器等相关技术)来实现该需求,并说明实现思路及关键要点。
22.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义基础类 BaseClass:包含通用的属性和方法。
  2. 使用装饰器:通过装饰器来动态修改或扩展子类的行为。装饰器可以接收配置参数,根据参数来决定如何修改子类。
  3. 创建子类:继承自 BaseClass,并应用装饰器来根据配置调整行为。

关键要点

  1. 装饰器参数:正确传递和解析装饰器的配置参数,以决定如何进行行为修改。
  2. 方法重写与新增:在装饰器内部实现对现有方法的修改逻辑,以及新增方法的逻辑。
  3. 继承关系:确保子类能正确继承 BaseClass 的属性和方法,并在装饰器作用下扩展或修改行为。

代码示例

// 基础类
class BaseClass {
    commonMethod() {
        console.log('This is a common method in BaseClass');
    }
}

// 装饰器工厂函数,接收配置参数
function modifyClass(config: { newMethod?: boolean, overrideMethod?: boolean }) {
    return function <T extends { new(...args: any[]): {} }>(constructor: T) {
        return class extends constructor {
            constructor(...args: any[]) {
                super(...args);
                if (config.newMethod) {
                    // 新增方法
                    this.newMethod = function () {
                        console.log('This is a new method added by decorator');
                    };
                }
                if (config.overrideMethod) {
                    // 重写方法
                    const originalCommonMethod = this.commonMethod.bind(this);
                    this.commonMethod = function () {
                        console.log('Override: Before original method');
                        originalCommonMethod();
                        console.log('Override: After original method');
                    };
                }
            }
        };
    };
}

// 创建子类并应用装饰器
@modifyClass({ newMethod: true, overrideMethod: true })
class SubClass extends BaseClass {}

// 测试
const subClassInstance = new SubClass();
subClassInstance.commonMethod();
if ('newMethod' in subClassInstance) {
    (subClassInstance as any).newMethod();
}