版本

no-unexpected-multiline

不允許令人困惑的多行表達式

建議

設定檔中使用 @eslint/jsrecommended 設定啟用此規則

在 JavaScript 中,分號通常是可選的,因為有自動分號插入 (ASI)。您可以使用 semi 規則來要求或不允許分號。

ASI 的規則相對簡單:正如 Isaac Schlueter 曾經描述的那樣,換行字元總是結束一個語句,就像分號一樣,除非以下其中一項為真

  • 該語句有一個未關閉的括號、陣列字面值或物件字面值,或者以其他無效的方式結束語句。(例如,以 ., 結尾。)
  • 該行是 --++(在這種情況下,它將遞減/遞增下一個符號。)
  • 它是 for()while()doif()else,並且沒有 {
  • 下一行以 [(+*/-,. 或其他只能在單一表達式中的兩個符號之間找到的二元運算符開頭。

在換行符號結束語句的例外情況下,省略分號的輸入錯誤會導致兩個不相關的連續行被解釋為一個表達式。特別是對於沒有分號的編碼風格,讀者可能會忽略這個錯誤。儘管語法上正確,但程式碼在執行時可能會拋出例外。

規則詳情

此規則不允許令人困惑的多行表達式,其中換行符號看起來像是結束一個語句,但實際上並非如此。

此規則的錯誤程式碼範例

在 Playground 中開啟
/*eslint no-unexpected-multiline: "error"*/

const foo = bar
(1 || 2).baz();

const hello = 'world'
[1, 2, 3].forEach(addNumber);

const x = function() {}
`hello`

const y = function() {}
y
`hello`

const z = foo
/regex/g.test(bar)

此規則的正確程式碼範例

在 Playground 中開啟
/*eslint no-unexpected-multiline: "error"*/

const foo = bar;
(1 || 2).baz();

const baz = bar
;(1 || 2).baz()

const hello = 'world';
[1, 2, 3].forEach(addNumber);

const hi = 'world'
void [1, 2, 3].forEach(addNumber);

const x = function() {};
`hello`

const tag = function() {}
tag `hello`

何時不該使用

如果您確信您不會意外引入這樣的程式碼,則可以關閉此規則。

請注意,被視為問題的模式不會semi 規則標記。

版本

此規則在 ESLint v0.24.0 中引入。

資源

變更語言