如何在子接口中为父接口所有方法加额外参数且不重复代码?
如何在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
相关产品推荐
相关产品推荐

