【问题标题】:Declaring intersecting types in Typescript?在 Typescript 中声明相交类型?
【发布时间】: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


【解决方案1】:

交集类型要求food是一个有效的FoodItems对象一个有效的FoodSide对象。 p>

记住:intersection type I = A & B 表示I 类型的值集合是A 类型值集合的intersectionB。由于I 类型的每个值同时 是一个有效的A 和一个有效的B,因此交集类型@987654331 的属性 @ 必须是 AB 类型的属性的并集

同样,联合类型U = A | B表示U类型值的集合是A类型值集合的联合B。由于U 类型的每个值要么 是有效的A 有效的B,因此属性联合类型U 必须是AB 类型的属性的交集

所以,你说的是FoodOrder 是一种可以用数字索引的类型,它返回一个FoodItems,但同时它也返回一个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
    }
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2020-05-15
    相关资源
    最近更新 更多