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
相关产品推荐
相关产品推荐

