TypeScript子类继承父类方法时如何复用参数类型?
TypeScript继承类方法避免重复定义参数类型的方案
当你在子类中重写父类方法时,不想手动重复参数类型,可以用以下几种方式解决:
直接通过父类原型获取方法类型
利用typeof获取父类原型上的方法类型,再配合Parameters提取参数元组,用剩余参数语法展开:
class Animal { eat(foodName: string) { console.log(`eating ${foodName}`); } } class Dog extends Animal { private counter = 0; // 自动复用父类eat方法的参数类型 eat(...[foodName]: Parameters<typeof Animal.prototype.eat>) { super.eat(foodName); this.counter++; } }
这种方式直接关联父类方法的类型,父类参数类型变更时,子类会自动同步,不用手动修改。
定义复用的参数类型别名
如果多个子类都要重写同一个父类方法,可以先把参数类型提取成别名,方便复用:
class Animal { eat(foodName: string) { console.log(`eating ${foodName}`); } } // 提取父类eat方法的参数类型 type AnimalEatParams = Parameters<typeof Animal.prototype.eat>; class Dog extends Animal { private counter = 0; eat(...[foodName]: AnimalEatParams) { super.eat(foodName); this.counter++; } } class Cat extends Animal { eat(...[foodName]: AnimalEatParams) { super.eat(foodName); console.log("喵呜~ 正在吃"); } }
直接复用父类方法的完整类型
如果希望子类方法的签名(包括参数和返回值)完全和父类一致,可以直接将方法类型设置为父类方法的类型:
class Animal { eat(foodName: string): void { console.log(`eating ${foodName}`); } } class Dog extends Animal { private counter = 0; eat: typeof Animal.prototype.eat = (foodName) => { super.eat(foodName); this.counter++; }; }
为什么你之前的写法不生效?
super.eat是运行时的表达式,而Parameters泛型需要的是类型层面的引用,不能直接传入运行时的值。必须通过typeof Animal.prototype.eat来获取父类方法的类型,才能被Parameters正确解析。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

