TypeScript父类转子类后调用子类方法失效问题解析
问题解答
为什么(a as B).toto()调用的是父类A的方法?
TypeScript的类型断言(as B)只是编译阶段的类型语法提示,完全不会改变运行时对象的实际类型。你这里const a: A = new A()创建的是实打实的A类实例,它的原型链指向A的原型对象。运行时JS引擎查找方法是依据原型链的,不管你怎么给它加类型断言,它本质还是A的实例,所以调用toto()时会执行A类里的方法。
为什么Drug实例调用断言后的方法只减1?
你传入的是new Drug("Old bottle of wine", 10),这是一个真正的Drug实例,和BottleOfWine没有任何运行时关联。updateAll()里的类型断言只是告诉TS编译器“这个对象是BottleOfWine类型”,但运行时这个对象的原型还是Drug的原型,调用updateEfficiency()时,JS会从Drug的原型上找到对应方法(效率减1),执行后自然变成9。
如果想要触发BottleOfWine的updateEfficiency(),你需要真正创建BottleOfWine的实例,也就是把new Drug(...)改成new BottleOfWine(...)。或者在updateAll()里根据name逻辑,把Drug实例转换成BottleOfWine实例(比如通过构造函数复制属性),而不是只靠类型断言。
内容的提问来源于stack exchange,提问作者coilvoltic
相关产品推荐
相关产品推荐

