如何用两个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
相关产品推荐
相关产品推荐

