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

如何用两个interface描述返回两类不同结果的数组,替代any类型?

问题解答

1. 联合类型是否可用

两个interface可以作为联合类型使用,你当前写法报错的核心原因是:赋值的set对象同时包含了匹配Arr、Obj两种接口的属性,不符合联合类型「只需满足其中任意一个接口的完整结构要求」的规则。
你定义的两个接口的规则如下:

  • Arr:对象的所有属性值都必须是包含单个id/name对象的元组
  • Obj:对象的所有属性值都必须是二级对象,二级对象的属性值才是上述元组
    你赋值的set同时存在ItemsArr(匹配Arr的属性值结构)和ItemsObj(匹配Obj的属性值结构)两个属性,既不满足Arr的全属性规则,也不满足Obj的全属性规则,因此类型校验不通过。

2. 正确写法

场景1:set需要同时存储两种结构的属性

直接定义匹配set结构的专属接口即可,还可以把重复的结构体抽离复用:

// 抽离公共的Item结构,避免重复编码
interface Item {
  id: string;
  name: string;
}

// 直接定义set的属性类型,不需要用联合
interface SetType {
  ItemsArr: [Item];
  ItemsObj: {
    [index: string]: [Item];
  };
}

const set : SetType = { 
  ItemsArr: context.ItemsArr['ItmesArr'], 
  ItemsObj: context.ItemsObj['ItmesObj'] 
};

如果你的set还会有其他动态属性,可以根据属性值类型补充索引签名。

场景2:确实需要使用联合类型

如果set只会存在一种结构的属性(要么全是Arr结构的属性,要么全是Obj结构的属性),直接只赋值对应结构的属性即可,联合类型会正常生效:

// 仅包含Arr结构的属性,符合Arr接口要求
const set1 : Arr | Obj = { ItemsArr: context.ItemsArr['ItmesArr'] };
// 仅包含Obj结构的属性,符合Obj接口要求
const set2 : Arr | Obj = { ItemsObj: context.ItemsObj['ItmesObj'] };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:45:05