Flow 中的对象作为地图
尽管Map类型已经出现,但普通对象仍然是表示地图的一种非常常见的方式。为了支持这种模式,Flow 提供了一种非常灵活的方式来表达这一点。
对象映射的用处
假设你想编写一个函数来计算一份购物清单的总价。调用它的方式如下:
// This would return 9.5 (4 + 3 + 2.5).
getTotalCost({
eggs: 4,
fruitSnacks: 3,
toothpaste: 2.5,
});
列表可以包含任意数量的项目,因此您无法明确将每个项目声明为属性。此外,您需要确保它只接受数字,因此:
getTotalCost({
eggs: 4,
toothpaste: 2.5,
milk: 'Too much',
});
…会出现类型错误。
将类型声明为对象映射
就像 Flow 中的很多东西一样,它非常简单。只需在括号中声明一个类型键并赋予它类型:
type GroceryList = {
// The keys of the object will be strings. The values will be numbers.
[name: string]: number,
};
// From there, use it as any other type.
function getTotalCost(groceryList: GroceryList): number {
// Take the value of each property, return the sum.
}
getTotalCost
将接受一个字符串键具有数字值的对象,并对其他任何内容给出类型错误:
// This works.
getTotalCost({
eggs: 4,
fruitSnacks: 3,
toothpaste: 2.5,
});
// Also okay.
getTotalCost({});
// Nope.
getTotalCost({
eggs: 4,
toothpaste: 2.5,
milk: 'Too much',
});