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

TypeScript中instanceof表达式报错ts(2358)的原因咨询

问题原因与解决方案

错误原因

你的代码中,A|B|C是Base的子类联合类型,TypeScript的类型系统能明确推断出:所有属于A|B|C类型的值,必然是Base的实例。因此第一个param instanceof Base的判断永远为true,后续else分支里的param会被收窄为never类型(代表不可能存在的值)。

而never类型无法作为instanceof的左侧操作数——因为它没有任何实际值,自然无法进行实例归属检查,这就触发了ts(2358)错误。

代码重现

class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}

function doSomething(param: A | B | C) {
  if (param instanceof Base) {
    return 'base';
  } else if (param instanceof A) { // 此处param被推断为never,触发ts(2358)
    return 'a';
  }
}

解决方案

根据你的实际需求,有两种修正方式:

1. 需要支持基类Base本身

如果函数需要同时处理基类实例和子类实例,把参数类型改成Base,然后优先判断子类,最后处理基类:

class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}

function doSomething(param: Base) {
  if (param instanceof A) {
    return 'a';
  } else if (param instanceof B) {
    return 'b';
  } else if (param instanceof C) {
    return 'c';
  } else {
    return 'base'; // 此处处理Base本身的实例
  }
}

2. 只处理子类,区分不同子类

如果函数仅接收子类实例,直接去掉对Base的判断,直接区分各个子类即可:

class Base {}
class A extends Base {}
class B extends Base {}
class C extends Base {}

function doSomething(param: A | B | C) {
  if (param instanceof A) {
    return 'a';
  } else if (param instanceof B) {
    return 'b';
  } else {
    return 'c'; // 此处param必然是C类型
  }
}

内容的提问来源于stack exchange,提问作者s.l

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:49:57