在 Flow 中使用枚举
如果您曾经接触过更传统的面向对象语言(C、C#、Java),那么您可能见过枚举数据类型。虽然 JavaScript 不支持枚举,但Flow 的类型检查可以弥补这一点。
枚举在哪些地方有用?
假设您正在编写一个处理扑克筹码的程序。筹码的颜色是一个字符串(即“红色”、“蓝色”等)。因此您的Chip
类型看起来应该类似于:
type Chip = {
color: string,
};
…创建芯片的函数是:
function createChip(color: string): Chip {
return {
color,
};
}
但您要确保它只使用有效的颜色:
// This should be valid.
createChip('red');
// This should not.
createChip('cyan');
// This isn't even a color.
createChip('Nicomachean Ethics');
创建枚举
定义枚举的最简单方法是将其作为字符串文字的联合:
// 'red', 'blue', and 'green' are valid colors.
type Color = 'red' | 'blue' | 'green';
从这里,你可以使用类型Color
来代替string
:
type Chip = {
// `color` can only be a valid color.
color: Color,
};
// `createChip` only takes values of type `Color`.
function createChip(color: Color): Chip {
return {
color,
};
}
根据现有值创建枚举
扑克筹码的价值取决于颜色。假设你有一个对象可以在项目中的某个地方查找值:
const chipValues = {
red: 5,
blue: 10,
green: 25,
};
该Color
类型重复了键。chipValues
如果只有三个键,情况还不算太糟,但仍然是重复,如果添加更多键,就会很烦人。Flow 提供了一种从具有以下类型的对象的键派生枚举的方法$Keys
:
type Color = $Keys<typeof chipValues>;