Type断言缺失属性问题:无法访问Superhuman子类的saveWorld方法
无法访问子类Superhuman的saveWorld方法问题排查
问题场景
以下是代码实现:
class Human { constructor() {} liveLife() {} } class Superhuman extends Human { saveWorld() {} } class PlayableCharacter { playable; constructor(playable: Human) { if (typeof playable === typeof Superhuman) { this.playable = playable as Superhuman; } else { this.playable = playable; } } } const character = new PlayableCharacter(new Superhuman());
尝试访问超人类属性时:
character.playable. // <-- 无法访问saveWorld函数
只能看到基类Human的属性,无法访问子类Superhuman的saveWorld方法。
问题原因
- typeof判断逻辑错误:
typeof playable获取的是实例的类型,类实例的typeof结果永远是'object';而typeof Superhuman获取的是类本身的类型,结果是'function'。两者永远不相等,导致if条件从未触发,playable始终被赋值为Human类型。 - 属性类型未明确注解:
PlayableCharacter中的playable属性没有声明类型,TypeScript会根据赋值逻辑推断其类型为Human,即使写了类型断言也无法改变这个推断结果。
解决方案
- 使用
instanceof判断实例是否属于Superhuman类,这是判断类实例归属的正确方式。 - 给
playable属性添加Human | Superhuman联合类型注解,让TypeScript明确该属性可能是父类或子类实例。
修改后的代码:
class Human { constructor() {} liveLife() {} } class Superhuman extends Human { saveWorld() {} } class PlayableCharacter { playable: Human | Superhuman; // 明确联合类型 constructor(playable: Human) { if (playable instanceof Superhuman) { // 使用instanceof判断实例归属 this.playable = playable; // TypeScript会自动识别子类类型 } else { this.playable = playable; } } } const character = new PlayableCharacter(new Superhuman()); character.playable.saveWorld(); // 现在可以正常访问saveWorld方法
内容的提问来源于stack exchange,提问作者lord_drgical
相关产品推荐
相关产品推荐

