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

如何在子接口中为父接口所有方法加额外参数且不重复代码?

如何在TypeScript子接口中扩展父接口的所有方法且无需重复代码?

当然可以做到!你想要的是让IBar继承IFoo的所有方法,同时给每个方法统一添加额外参数,又不想重复编写methodOne和methodTwo的定义对吧?用TypeScript的映射类型就能轻松实现这个需求,完全不用重复父接口的代码。

具体实现步骤:

首先先回顾你的原始父接口:

interface IFoo {
  methodOne(a: any): void;
  methodTwo(a: any): void;
}

我们先创建一个通用工具类型,它的作用是给传入类型的所有方法都追加指定的额外参数:

// 定义一个工具类型,给方法添加b和c两个额外参数
type AddExtraParams<T> = {
  [MethodName in keyof T]: 
    T[MethodName] extends (...originalArgs: infer Args) => infer ReturnType
      ? (...args: [...originalArgs, b: any, c: any]) => ReturnType
      : T[MethodName];
};

这个映射类型会遍历T的每个属性:如果是方法,就通过类型推断获取它的原始参数和返回类型,然后把原始参数展开,再追加b和c两个参数,返回类型保持不变;如果不是方法则直接保留原类型。

接下来定义IBar就非常简单了,直接继承这个经过改造的类型即可:

interface IBar extends AddExtraParams<IFoo> {}

验证效果

现在IBar自动拥有了带额外参数的两个方法,你可以像下面这样实现它:

class BarImpl implements IBar {
  methodOne(a: any, b: any, c: any) {
    console.log("methodOne called with", a, b, c);
  }

  methodTwo(a: any, b: any, c: any) {
    console.log("methodTwo called with", a, b, c);
  }
}

而且这个方案还有个额外好处:如果后续IFoo新增了方法,IBar会自动继承并给新方法也加上额外参数,完全不用手动修改IBar的定义,维护成本极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:09:38