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

如何在TypeScript接口中使用两种复杂数据类型的联合类型?

如何在TypeScript接口中使用两种复杂数据类型的联合类型?

哈哈,这种对接有“小bug”的API场景太常见了!返回的数据结构突然变样,既要兼容两种格式又不想放弃TypeScript的类型检查,其实用联合类型完全能搞定,而且还能让代码更清爽。

首先我建议你先把那两种复杂的子类型单独抽成独立接口,别直接写在联合里,不然代码堆在一起看着头疼:

// 先把两种不同的结构拆成独立接口
interface ApiResponseType1 {
  subPropA: {
    prop2: string;
  };
}

interface ApiResponseType2 {
  prop2: string;
}

// 然后在主接口里用联合类型组合它们
export interface MyObject {
  prop1: ApiResponseType1 | ApiResponseType2;
}

这样定义完,TypeScript就明白prop1可能是这两种类型中的任意一种了。不过接下来用的时候得注意,直接访问prop2会报错,因为TS不确定当前是哪种类型——这时候就得用类型守卫来帮TS“识别”类型:

最简单的就是用in操作符判断属性是否存在:

function processProp1(prop: ApiResponseType1 | ApiResponseType2) {
  if ('subPropA' in prop) {
    // 到这里TS就确定这是ApiResponseType1了
    console.log(prop.subPropA.prop2);
  } else {
    // 这里自然就是ApiResponseType2啦
    console.log(prop.prop2);
  }
}

如果API返回的结构里有更明确的区分字段(比如有的返回里带个type: 'nested',有的是type: 'flat'),那用字面量类型守卫会更靠谱:

// 给每个类型加个标识字段
interface ApiResponseType1 {
  type: 'nested';
  subPropA: {
    prop2: string;
  };
}

interface ApiResponseType2 {
  type: 'flat';
  prop2: string;
}

function processProp1(prop: ApiResponseType1 | ApiResponseType2) {
  if (prop.type === 'nested') {
    console.log(prop.subPropA.prop2);
  } else {
    console.log(prop.prop2);
  }
}

这样处理之后,既能严格定义接口类型,又能在使用时避免类型报错,完美适配你遇到的API返回异常的情况~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:55:30