Javascript 在Typescript中声明相交类型?
我从官方文档开始学习typescript,并遇到了交叉类型的主题。所以,为了正确理解类型交集是如何工作的,我决定编写一个自定义类型。FoodItems接口要求是一个对象数组,并且与side相同。然而,每当我尝试将这两种类型相交时,FoodOrder的每个表示都会失败。我不明白为什么会这样,我做错了什么Javascript 在Typescript中声明相交类型?,javascript,typescript,types,typescript-typings,tsc,Javascript,Typescript,Types,Typescript Typings,Tsc,我从官方文档开始学习typescript,并遇到了交叉类型的主题。所以,为了正确理解类型交集是如何工作的,我决定编写一个自定义类型。FoodItems接口要求是一个对象数组,并且与side相同。然而,每当我尝试将这两种类型相交时,FoodOrder的每个表示都会失败。我不明白为什么会这样,我做错了什么 interface FoodItems { [index: number]: {name: string, quantityPerOrder: number}; } interface F
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;
声明让食物:FoodOrder=[{name:“Fried Chiken”,quantityperder:2}],{sideName:“肉汁”,sideQuantity:1}]代码>
显示以下错误:
index.ts:14:24 - error TS2322: Type '[{ name: string; quantityPerOrder: number; }]' is not assignable to type '{ name: string; quantityPerOrder: number; } & { sideName: string; sideQuantity: number; }'.
Type '[{ name: string; quantityPerOrder: number; }]' is not assignable to type '{ name: string; quantityPerOrder: number; }'.
14 let food: FoodOrder = [[{name: "Fried Chiken", quantityPerOrder: 2}],[{sideName: "gravy", sideQuantity: 1}]];
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index.ts:14:70 - error TS2322: Type '[{ sideName: string; sideQuantity: number; }]' is not assignable to type '{ name: string; quantityPerOrder: number; } & { sideName: string; sideQuantity: number; }'.
Type '[{ sideName: string; sideQuantity: number; }]' is not assignable to type '{ name: string; quantityPerOrder: number; }'.
14 let food: FoodOrder = [[{name: "Fried Chiken", quantityPerOrder: 2}],[{sideName: "gravy", sideQuantity: 1}]];
交叉点类型要求food
既是有效的FoodItems
对象,也是有效的FoodSide
对象
记住:交叉点类型I=A&B
意味着类型I
的值集是类型A
和B
的值集的交叉点。由于类型I
的每个值同时是有效的a
和有效的B
,因此交叉点类型I
的属性必须是类型a
和B
属性的并集
同样,联合类型U=a | B
意味着类型U
的值集是类型a
和B
的值集的联合。由于类型U
的每个值要么是有效的a
要么是有效的B
,因此联合类型U
的属性必须是类型a
和B
属性的交集
因此,您的意思是,FoodOrder
是一种可以通过数字索引的类型,它返回一个FoodItems
,但同时,当它通过数字索引时,它也返回一个FoodSide
这种类型的值不可能存在,因此您实际上无法构造任何可以合法分配给食品的值
可能的情况是这样的:
接口FoodItem{
名称:string
QuantityPerder:数字
}
界面食品侧{
侧名:字符串
数量:个
}
接口FoodOrder{
[索引:编号]:FoodItem和FoodSide
}
让食物:FoodOrder;
食物=[
{
名称:“油炸韭菜”,
量化误差:2,
侧名:“肉汁”,
数量:1
}
];
just dotype FoodOrder=FoodItems | FoodSide
cause&将它们合并为一个(因为所有4个属性都是必需的),而|将使i成为类型FoodItems和FoodSide的一个或另一个交集,FoodItems和FoodSide是一组具有零元素的对象,因此不能为其分配任何内容。你可能想要一个联盟。