在 Typescript 中声明交叉类型?

Declaring intersecting types in 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;

声明
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}]];

一个交集类型需要food两者一个有效的FoodItems对象一个有效的FoodSide对象。

记住:交集类型 I = A & B 表示类型 I 的值集是 交集 类型 AB 的值集。由于 I 类型的每个值同时是 一个有效的 A 和一个有效的 B,因此 交集类型 I 的 properties 必须是类型 AB.[=38 的属性的 union =]

同样,联合类型U = A | B意味着U类型的值集是联合 类型 AB 的值集。由于类型 U 的每个值都是 或者 一个有效的 A 或者 一个有效的 B,它遵循联合类型 Uproperties 必须是类型 A 和 [=] 的 intersection 17=].

所以,你说的是 FoodOrder 是一种可以用数字索引的类型,它 returns 是 FoodItems 但同时 time 它也是 returns 一个 FoodSide 当它被一个数字索引时。

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

的东西

可能是这样的:

interface FoodItem {
    name:             string
    quantityPerOrder: number
}

interface FoodSide {
    sideName:         string
    sideQuantity:     number
}

interface FoodOrder {
  [index: number]: FoodItem & FoodSide
}

let food: FoodOrder;

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