跳到主要內容

嚴謹的布林運算式

不允許布林運算式中的特定類型。

🔧

此規則所回報的某些問題可以用 --fix ESLint 命令列選項自動修復.

💡

此規則所回報的某些問題可以用編輯器手動修正 建議.

💭

此規則需要 類型資訊 才能執行。

禁止在應使用布林值的運算式中使用非布林類型。booleannever 類型始終被允許。額外視為在布林文中安全的類型,可透過選項進行設定。

以下節點被視為布林運算式,並檢查其類型

  • 邏輯否定的運算子 (!arg) 引數。
  • 條件運算式 (cond ? x : y) 中的條件。
  • ifforwhiledo-while 陳述式的條件。
  • 邏輯二元運算子 (lhs || rhslhs && rhs) 的運算元。
    • 當它不是其他布林運算式的後代時,右側運算元會被忽略。這是為了允許基於其短路行為使用布林運算子。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/strict-boolean-expressions": "error"
}
};

在練習區嘗試此規則 ↗

範例

// nullable numbers are considered unsafe by default
let num: number | undefined = 0;
if (num) {
console.log('num is defined');
}

// nullable strings are considered unsafe by default
let str: string | null = null;
if (!str) {
console.log('str is empty');
}

// nullable booleans are considered unsafe by default
function foo(bool?: boolean) {
if (bool) {
bar();
}
}

// `any`, unconstrained generics and unions of more than one primitive type are disallowed
const foo = <T>(arg: T) => (arg ? 1 : 0);

// always-truthy and always-falsy types are disallowed
let obj = {};
while (obj) {
obj = getObj();
}
在遊樂場開啟

選項

此規則接受以下選項

type Options = [
{
allowAny?: boolean;
allowNullableBoolean?: boolean;
allowNullableEnum?: boolean;
allowNullableNumber?: boolean;
allowNullableObject?: boolean;
allowNullableString?: boolean;
allowNumber?: boolean;
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing?: boolean;
allowString?: boolean;
},
];

const defaultOptions: Options = [
{
allowString: true,
allowNumber: true,
allowNullableObject: true,
allowNullableBoolean: false,
allowNullableString: false,
allowNullableNumber: false,
allowNullableEnum: false,
allowAny: false,
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
},
];

allowString

在布林情境中允許 string。此舉很安全,因為字串只有一個偽值 ("")。如果你偏好明確的 str != ""str.length > 0 樣式,請將其設定為 false

allowNumber

在布林情境中允許 number。此舉很安全,因為數字只有兩個偽值 (0NaN)。如果你偏好明確的 num != 0!Number.isNaN(num) 樣式,請將其設定為 false

allowNullableObject

在布林情境中允許 object | function | symbol | null | undefined。此舉很安全,因為物件、函式和符號沒有偽值。如果你偏好明確的 obj != null 樣式,請將其設定為 false

allowNullableBoolean

在布林情境中允許 boolean | null | undefined。此舉很危險,因為允許為空的布林可能是 false 或 null。如果你想要強制明確的 bool ?? falsebool ?? true 樣式,請將其設定為 false。如果你不介意隱含地將 false 視為 null 值,請將其設定為 true

allowNullableString

在布林情境中允許 string | null | undefined。此舉很危險,因為允許為空的字串可能是空字串或 null。如果你不介意隱含地將空字串視為 null 值,請將其設定為 true

allowNullableNumber

在布林情境中允許 number | null | undefined。此舉很危險,因為允許為空的數字可能是偽數字或 null。如果你不介意隱含地將 0 或 NaN 視為 null 值,請將其設定為 true

allowNullableEnum

允許在布林值中使用 enum | null | undefined。這是不安全的,因為可為 null 的列舉可能是假數值或 nullish。如果您不介意隱含將值為零的列舉視為與 nullish 值相同,請將此值設定為 true

allowAny

允許在布林值中使用 any。這顯然是不安全的。請自行承擔將此值設定為 true 的風險。

allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing

如果將此值設定為 false,則此規則會在每個 tsconfig.json 未將編譯器選項 strictNullChecks(或 strict)設定為 true 的檔案中造成錯誤。

在未使用 strictNullChecks 的情況下,TypeScript 基本上會從類型中移除 undefinednull。這意味著,當此規則檢查變數的類型時,無法得知變數可能是 nullundefined,這基本讓此規則變得不那麼有用。

您應使用 strictNullChecks,以確保程式碼庫中的類型安全性完整。

如果您基於某些原因無法啟用 strictNullChecks,但仍想使用此規則,則可以使用此選項允許使用該規則,但請注意,如果關閉編譯器選項,此規則的行為是未定義的。如果您使用此選項,我們不接受問題回報。

修正和建議

此規則提供下列修正和建議,適用於布林值中的特定類型

  • boolean - 始終允許 - 無需修正。
  • string -(當 allowStringfalse 時)- 提供下列建議
    • 變更條件,用以檢查字串長度 (strstr.length > 0)
    • 變更條件,用以檢查空字串 (strstr !== "")
    • 將值明確轉型為布林值 (strBoolean(str))
  • number -(當 allowNumberfalse 時)
    • 對於 array.length - 提供自動修正
      • 變更條件,用以檢查 0 (array.lengtharray.length > 0)
    • 對於其他數值 - 提供下列建議
      • 變更條件,用以檢查 0 (numnum !== 0)
      • 變更條件,用以檢查 NaN (num!Number.isNaN(num))
      • 將值明確轉型為布林值 (numBoolean(num))
  • 物件 | null | undefined - (當 allowNullableObjectfalse 時) - 提供自動修正
    • 變更條件為檢查 null/undefined (maybeObjmaybeObj != null)
  • 布林 | null | undefined - 提供下列建議事項
    • 將 null 值明確視為 false (maybeBoolmaybeBool ?? false)
    • 變更條件為檢查 true/false (maybeBoolmaybeBool === true)
  • 字串 | null | undefined - 提供下列建議事項
    • 變更條件為檢查 null/undefined (maybeStrmaybeStr != null)
    • 將 null 值明確視為空字串 (maybeStrmaybeStr ?? "")
    • 明確將值轉換為布林 (maybeStrBoolean(maybeStr))
  • 數字 | null | undefined - 提供下列建議事項
    • 變更條件為檢查 null/undefined (maybeNummaybeNum != null)
    • 將 null 值明確視為 0 (maybeNummaybeNum ?? 0)
    • 明確將值轉換為布林 (maybeNumBoolean(maybeNum))
  • 任何未知 - 提供下列建議事項
    • 明確將值轉換到布林 (Boolean(值))

何時不應使用它

如果專案不太可能在邏輯條件中使用錯誤的非布林值而導致錯誤,則可以略過啟用此規則。

否則,對於要求在邏輯檢查中進行精確比較,這個規則可能非常嚴格。如果您偏好更簡潔的檢查,而不是更精確的布林邏輯,則此規則可能不適合您。


類型檢查的 Lint 規則比傳統的 Lint 規則更強大,但還需要設定類型檢查的 Lint。如果您在啟用類型檢查規則後發現效能下降,請參閱效能問題排除

資源