跳至主要內容

錯誤抑制

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 */ }

要成為有效的抑制註解,還必須符合一些條件

  • 抑制器前面不能有任何文字,也不能在抑制器和程式碼之間有文字。例如:// 一些文字然後 $FlowFixMe 不是有效的抑制,// $FlowIssue 一些文字 [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;

這將抑制此行上的兩個錯誤。