You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何继承类并修改参数且无需逐个覆写方法?

TypeScript 自动覆写基类所有方法的通用方案

要实现无需逐个显式覆写基类方法,同时统一添加自定义逻辑(比如给第二个参数追加"TEST"),可以通过动态遍历基类原型方法并覆写的方式实现,以下是具体方案:

1. 基础实现(直接子类写法)

先修正原代码的TypeScript语法错误,再在子类构造函数中完成动态覆写:

class A {
  foo(a: string, b: string) {
    console.log(`${a} ${b}`);
  }

  bar(a: number, b: string) {
    console.log(`${b} ${a}`);
  }
}

class B extends A {
  constructor(...args: any[]) {
    super(...args);

    // 遍历基类原型上的所有方法
    const baseProto = A.prototype;
    for (const key of Object.getOwnPropertyNames(baseProto)) {
      const originalMethod = baseProto[key];
      // 仅处理函数类型,排除构造函数
      if (typeof originalMethod === 'function' && key !== 'constructor') {
        // 覆写当前实例的方法
        (this as any)[key] = (...args: any[]) => {
          // 自定义逻辑:给第二个参数追加"TEST"
          if (args.length >= 2) {
            args[1] += ' TEST';
          }
          // 调用原方法并返回结果
          return originalMethod.apply(this, args);
        };
      }
    }
  }
}

// 测试
const b = new B();
b.foo("arg1", "arg2"); // 输出: arg1 arg2 TEST
b.bar(123, "hello"); // 输出: hello TEST 123

2. 通用工厂函数(高扩展性)

如果需要复用这种覆写逻辑到多个类,建议封装成工厂函数,传入基类和自定义逻辑即可生成子类:

class A {
  foo(a: string, b: string) {
    console.log(`${a} ${b}`);
  }

  bar(a: number, b: string) {
    console.log(`${b} ${a}`);
  }
}

// 通用工厂函数:接收基类和参数修改逻辑,返回子类
function createExtendedClass<T extends new (...args: any[]) => any>(
  BaseClass: T,
  modifyArgs: (args: any[]) => any[]
) {
  return class extends BaseClass {
    constructor(...args: any[]) {
      super(...args);

      const baseProto = BaseClass.prototype;
      for (const key of Object.getOwnPropertyNames(baseProto)) {
        const originalMethod = baseProto[key];
        if (typeof originalMethod === 'function' && key !== 'constructor') {
          (this as any)[key] = (...args: any[]) => {
            const modifiedArgs = modifyArgs(args);
            return originalMethod.apply(this, modifiedArgs);
          };
        }
      }
    }
  };
}

// 生成子类B,传入自定义参数修改逻辑
const B = createExtendedClass(A, (args) => {
  if (args.length >= 2) {
    args[1] += ' TEST';
  }
  return args;
});

// 测试
const b = new B();
b.foo("arg1", "arg2"); // 输出: arg1 arg2 TEST
b.bar(123, "hello"); // 输出: hello TEST 123

注意事项

  • 该方案仅能覆写基类原型上的可枚举方法,私有方法不会出现在原型中,无法处理
  • 若需区分基类自身方法和继承来的方法,可结合baseProto.hasOwnProperty(key)过滤
  • 参数修改逻辑需适配方法的参数类型,避免类型错误

内容的提问来源于stack exchange,提问作者quicky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:32:37