在 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
的值集是 交集 类型 A
和 B
的值集。由于 I
类型的每个值同时是 一个有效的 A
和一个有效的 B
,因此 交集类型 I
的 properties 必须是类型 A
和 B
.[=38 的属性的 union =]
同样,联合类型U = A | B
意味着U
类型的值集是联合 类型 A
和 B
的值集。由于类型 U
的每个值都是 或者 一个有效的 A
或者 一个有效的 B
,它遵循联合类型 U
的 properties 必须是类型 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
}
];
我是从官方文档开始学习打字稿的,遇到了交叉类型这个话题。因此,为了正确理解类型交集的工作原理,我决定编写一个自定义类型。 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
的值集是 交集 类型 A
和 B
的值集。由于 I
类型的每个值同时是 一个有效的 A
和一个有效的 B
,因此 交集类型 I
的 properties 必须是类型 A
和 B
.[=38 的属性的 union =]
同样,联合类型U = A | B
意味着U
类型的值集是联合 类型 A
和 B
的值集。由于类型 U
的每个值都是 或者 一个有效的 A
或者 一个有效的 B
,它遵循联合类型 U
的 properties 必须是类型 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
}
];