跳至主要内容

错误抑制

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;

这将抑制此行上的两个错误。