是否可以安全地使用 Switch over FlowType 联合类型(字符串枚举)?
Is it possible to safely use Switch over FlowType union types (String Enums)?
在下面的示例中,由于我使用 switch 语句对消息类型进行匹配,因此我希望流程能够识别我不正确的 'ENUM_TYPO' 大小写。目前没有。
type Message = 'BROADCAST_MESSAGE' | 'PRIVATE_MESSAGE';
const message: Message = 'BROADCAST_MESSAGE';
switch (message) {
case 'ENUM_TYPO':
// Do Broadcast
break;
default:
break;
}
从 v0.32.0 开始,Flow 不会抱怨无法访问的代码,除非是类似
// @flow
function foo() {
throw new Error();
return 123; // This will error
}.
但是,请考虑以下代码
// @flow
function foo(x: string): Object {
if (x === 123) {
return x;
}
return {};
}
目前不会在此代码上出错。 Flow 实际上注意到 x === 123
永远不会为真。在 if
块内,Flow 会将 x
的类型细化为空类型,因为它认为永远不会到达此代码。这就是为什么它不抱怨 return x
声明。
Flow 团队的一名成员即将完成向 Flow 添加可达性分析。一旦这个改进落地(我猜是 v0.34.0?),当 Flow 看到它认为总是会失败的条件时,它会抱怨。这将对您的示例有所帮助,因为 switch 语句的情况基本上是严格的相等性检查。
在下面的示例中,由于我使用 switch 语句对消息类型进行匹配,因此我希望流程能够识别我不正确的 'ENUM_TYPO' 大小写。目前没有。
type Message = 'BROADCAST_MESSAGE' | 'PRIVATE_MESSAGE';
const message: Message = 'BROADCAST_MESSAGE';
switch (message) {
case 'ENUM_TYPO':
// Do Broadcast
break;
default:
break;
}
从 v0.32.0 开始,Flow 不会抱怨无法访问的代码,除非是类似
// @flow
function foo() {
throw new Error();
return 123; // This will error
}.
但是,请考虑以下代码
// @flow
function foo(x: string): Object {
if (x === 123) {
return x;
}
return {};
}
目前不会在此代码上出错。 Flow 实际上注意到 x === 123
永远不会为真。在 if
块内,Flow 会将 x
的类型细化为空类型,因为它认为永远不会到达此代码。这就是为什么它不抱怨 return x
声明。
Flow 团队的一名成员即将完成向 Flow 添加可达性分析。一旦这个改进落地(我猜是 v0.34.0?),当 Flow 看到它认为总是会失败的条件时,它会抱怨。这将对您的示例有所帮助,因为 switch 语句的情况基本上是严格的相等性检查。