【发布时间】:2021-01-03 07:39:20
【问题描述】:
我从官方文档开始学习打字稿,遇到了交叉类型的话题。因此,为了正确理解类型交集的工作原理,我决定编写一个自定义类型。 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;
声明 let food: FoodOrder = [[{name: "Fried Chiken", quantityPerOrder: 2}],[{sideName: "gravy", 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}]];
【问题讨论】:
-
只需执行
type FoodOrder = FoodItems | FoodSide原因 & 会将它们合并为一个(因为需要所有 4 个属性),而 |会让我成为一个或另一个 -
FoodItems 和 FoodSide 类型的交集是一组具有零元素的对象,因此您不能为其分配任何内容。你可能想要一个工会。
标签: javascript typescript types typescript-typings tsc