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

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方法。

问题原因

  1. typeof判断逻辑错误:typeof playable获取的是实例的类型,类实例的typeof结果永远是'object';而typeof Superhuman获取的是类本身的类型,结果是'function'。两者永远不相等,导致if条件从未触发,playable始终被赋值为Human类型。
  2. 属性类型未明确注解:PlayableCharacter中的playable属性没有声明类型,TypeScript会根据赋值逻辑推断其类型为Human,即使写了类型断言也无法改变这个推断结果。

解决方案

  1. 使用instanceof判断实例是否属于Superhuman类,这是判断类实例归属的正确方式。
  2. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:02:07