错误抑制
Flow 会报告许多不同类型的错误,这些错误对应于许多常见的编程错误,但并非所有 JavaScript 模式都能被 Flow 理解。如果您确信代码正确,并且 Flow 的错误报告过于保守,则可以抑制错误,以便 Flow 不再报告该错误。
什么是抑制?
抑制是一种特殊的注释,您可以将其放在类型错误之前的行上。它告诉 Flow 在检查代码时不要报告该错误。抑制注释如下所示
// <SUPPRESSOR>[<CODE>] extra text
抑制器可以是以下之一
$FlowFixMe
:用于您打算稍后修复的类型错误$FlowIssue
:用于您怀疑是 Flow 问题导致的类型错误$FlowExpectedError
:用于您期望 Flow 产生类型错误的位置(例如,执行无效类型转换时)。$FlowIgnore
:用于您希望 Flow 忽略代码的位置
请注意,所有抑制器都具有相同的行为;我们只是建议您按照此处所述使用它们,以便于您自己参考。
抑制中的 <CODE>
部分是可选的,但如果包含,则指定抑制影响的错误代码。
一些抑制注释示例
// $FlowFixMe
// $FlowIssue[incompatible-type]
/* $FlowIgnore[prop-missing] some other text here */
/* $FlowFixMe[incompatible-cast] this
is a multi-line
comment */
{ /* $FlowIssue this is how you suppress errors inside JSX */ }
为了成为有效的抑制注释,还必须满足一些条件
- 抑制器之前不能有任何文本,也不能在抑制器和代码之间有任何文本。例如:
// some text then $FlowFixMe
不是有效的抑制,// $FlowIssue some text [incompatible-type]
或//$FlowFixMe [prop-missing]
也不行(请注意此处有空格!)。 - 抑制必须位于要抑制的错误之前的行,否则它们将不适用。
使用错误代码使抑制更细粒度
可抑制的 Flow 错误也会有与其关联的错误代码(版本 0.127 之后)。此代码简洁地描述了错误报告的问题类型,并且不同类型的错误之间有所不同。
为了防止抑制在同一行上抑制不同类型的类型错误(默认情况下,没有代码的抑制会抑制下一行上的所有错误),您可以在抑制中添加错误代码。例如:// $FlowFixMe[incompatible-cast]
仅会抑制具有 incompatible-cast
代码的错误。所以
1// $FlowFixMe[incompatible-cast]23 as string;
不会报告任何错误,但
1// $FlowFixMe[prop-missing]23 as string;
2:1-2:1: Cannot cast `3` to string because number [1] is incompatible with string [2]. [incompatible-cast]
仍然会报告类型不兼容。
要在同一行上抑制多个错误代码,您可以将抑制注释一个接一个地堆叠起来,它们都会应用于第一个非注释行,如下所示
1let y: number | {x : number} = 1;2
3// $FlowFixMe[incompatible-cast]4// $FlowFixMe[prop-missing]5y.x as string;
这将抑制此行上的两个错误。