Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Typescript中声明相交类型?_Javascript_Typescript_Types_Typescript Typings_Tsc - Fatal编程技术网

Javascript 在Typescript中声明相交类型?

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

我从官方文档开始学习typescript,并遇到了交叉类型的主题。所以,为了正确理解类型交集是如何工作的,我决定编写一个自定义类型。FoodItems接口要求是一个对象数组,并且与side相同。然而,每当我尝试将这两种类型相交时,FoodOrder的每个表示都会失败。我不明白为什么会这样,我做错了什么

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 do
type FoodOrder=FoodItems | FoodSide
cause&将它们合并为一个(因为所有4个属性都是必需的),而|将使i成为类型FoodItems和FoodSide的一个或另一个交集,FoodItems和FoodSide是一组具有零元素的对象,因此不能为其分配任何内容。你可能想要一个联盟。