You need to enable JavaScript to run this app. TypeScript中<IVehicle|IHouse>联合类型访问独有属性报错如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中<IVehicle|IHouse>联合类型访问独有属性报错如何解决?

问题原因

TypeScript 对于 IVehicle | IHouse 这类联合类型,默认只允许访问所有类型共有的属性(本场景中只有color是两个接口共有的属性),bedrooms仅属于IHouse接口,所以直接访问会触发类型报错。

解决方案

以下3种常用方案都不需要修改API返回结构即可解决问题:

方案1:用in操作符做即时类型收窄

最便捷的轻量处理方式,直接在遍历逻辑中判断独有属性是否存在,TS会自动完成类型收窄:

class MyClass extends Record({
  apiResponse: Array<IVehicle | IHouse>(),
}) {
  // 示例:提取所有IHouse的bedrooms,非IHouse类型可返回默认值或过滤
  getBedroomsList() {
    return this.apiResponse.map(item => {
      if ('bedrooms' in item) {
        // 此处TS会自动识别item为IHouse类型,可正常访问对应属性
        return item.bedrooms
      }
      // 非IHouse类型的处理逻辑,示例为返回null后过滤
      return null
    }).filter(Boolean)
  }
}

方案2:自定义类型守卫(多场景复用时推荐)

如果项目多处需要判断两类对象类型,可以封装类型守卫函数,逻辑更严谨复用性更高:

// 自定义类型守卫:判断对象是否为IHouse类型
function isHouse(item: IVehicle | IHouse): item is IHouse {
  return 'bedrooms' in item && 'bathrooms' in item
}
// 自定义类型守卫:判断对象是否为IVehicle类型
function isVehicle(item: IVehicle | IHouse): item is IVehicle {
  return 'wheels' in item && 'brand' in item
}

class MyClass extends Record({
  apiResponse: Array<IVehicle | IHouse>(),
}) {
  apiResponse.map(item => {
    if (isHouse(item)) {
      return item.bedrooms
    }
    // 处理车辆类型的逻辑示例
    return item.brand
  })
}

方案3:类型断言(仅当100%确认类型时使用)

如果你明确知道当前遍历的元素一定是IHouse类型,可以直接用类型断言绕过TS检查,注意该方式没有运行时校验,类型判断错误会引发运行时问题:

class MyClass extends Record({
  apiResponse: Array<IVehicle | IHouse>(),
}) {
  // 直接断言为IHouse类型访问属性
  apiResponse.map((item) => (item as IHouse).bedrooms) 
}

内容的提问来源于stack exchange,提问作者XueXu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 05:06:01