在Typescript中声明相交类型?

问题描述

我已经开始从官方文档中学习打字稿,并且遇到了交叉类型的话题。因此,为了正确理解类型交集是如何工作的,我决定编写一个自定义类型。 FoodItems接口必须是对象数组,并且侧面相同。但是,每当我尝试将两种类型相交时,Foodorder的每种表示都会失败。我不明白为什么会这样以及我在做什么错。

alloca

声明
interface FoodItems { [index: number]: {name: string,quantityPerOrder: number}; } interface FoodSide { [index: number]: {sideName: string,sideQuantity: number}; } let foodItem: FoodItems = [{name: "Fried Chiken",quantityPerOrder: 2},{name: "Burger",quantityPerOrder: 1}]; let foodSide: FoodSide = [{sideName: "gravy",sideQuantity: 1}]; type Foodorder = FoodItems & FoodSide; let food: Foodorder;
给了我以下错误

let food: Foodorder = [[{name: "Fried Chiken",quantityPerOrder: 2}],[{sideName: "gravy",sideQuantity: 1}]];

解决方法

交叉点类型要求food既是有效的FoodItems对象,又是有效的{{1 }}对象。

请记住:交集类型FoodSide 表示类型I = A & B的值集是交集类型的 intersection 类型IA。由于类型B的每个值同时是 有效的I和有效的A,因此 properties 相交类型B的类型必须是类型IA的属性的 union

同样,联合类型B 表示类型U = A | B的值集合是的值集合的 union 类型UA。由于类型B的每个值都是有效的U 或有效的A的,因此得出属性联合类型B必须是类型UA的属性的 intersection

因此,您要说的是B是一种可以用数字索引的类型,它返回一个FoodOrder,但同时 也会返回FoodItems(按数字索引)。

这种类型的值不存在,因此您实际上无法构造任何合法的分配给FoodSide的值。

可能可能是这样的:

food