メインコンテンツにスキップ

strict-boolean-expressions

ブール式での特定の型の使用を禁止します。

🔧

このルールによって報告される一部の問題は、 --fix ESLint コマンドラインオプションで自動的に修正できます。.

💡

このルールによって報告される一部の問題は、エディターの 提案によって手動で修正できます。.

💭

このルールを実行するには 型情報 が必要です。

ブール値が期待される式で、ブール型以外の型の使用を禁止します。boolean 型と never 型は常に許可されます。ブール値のコンテキストで安全とみなされる追加の型は、オプションで構成できます。

次のノードはブール式とみなされ、その型がチェックされます。

  • 論理否定演算子(!arg)の引数。
  • 条件式(cond ? x : y)の条件。
  • ifforwhile、および do-while ステートメントの条件。
  • 論理二項演算子(lhs || rhs および lhs && 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 を許可します。文字列には偽の値が 1 つ("")しかないため、これは安全です。明示的な str != "" または str.length > 0 スタイルを好む場合は、これを false に設定します。

allowNumber

ブール値コンテキストで number を許可します。数値には偽の値が 2 つ(0NaN)しかないため、これは安全です。明示的な num != 0 および !Number.isNaN(num) スタイルを好む場合は、これを false に設定します。

allowNullableObject

ブール値コンテキストで object | function | symbol | null | undefined を許可します。オブジェクト、関数、シンボルには偽の値がないため、これは安全です。明示的な obj != null スタイルを好む場合は、これを false に設定します。

allowNullableBoolean

ブール値コンテキストで boolean | null | undefined を許可します。nullable なブール値は false または nullish のいずれかになる可能性があるため、これは安全ではありません。明示的な bool ?? false または bool ?? true スタイルを強制する場合は、これを false に設定します。false を nullish 値と同じように暗黙的に扱うことを気にしない場合は、これを true に設定します。

allowNullableString

ブール値コンテキストで string | null | undefined を許可します。nullable な文字列は空文字列または nullish のいずれかになる可能性があるため、これは安全ではありません。空文字列を nullish 値と同じように暗黙的に扱うことを気にしない場合は、これを true に設定します。

allowNullableNumber

ブール値コンテキストで number | null | undefined を許可します。nullable な数値は偽の値または nullish のいずれかになる可能性があるため、これは安全ではありません。ゼロまたは NaN を nullish 値と同じように暗黙的に扱うことを気にしない場合は、これを true に設定します。

allowNullableEnum

ブール値コンテキストで enum | null | undefined を許可します。nullable な enum は偽の数値または nullish のいずれかになる可能性があるため、これは安全ではありません。値がゼロである enum を nullish 値と同じように暗黙的に扱うことを気にしない場合は、これを true に設定します。

allowAny

ブール値コンテキストで any を許可します。これは、明らかな理由で安全ではありません。自己責任でこれを true に設定してください。

allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing

これが false に設定されている場合、ルールは、tsconfig.jsonstrictNullChecks コンパイラオプション(または strict)が true に設定されていないすべてのファイルでエラーになります。

strictNullChecks がない場合、TypeScript は基本的に型から undefinednull を消去します。これは、このルールが変数から型を検査するとき、**変数が null または undefined である可能性があることを判別できない**ことを意味し、このルールは実質的により役に立たなくなります。

コードベースで完全な型安全性を確保するには、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)
  • object | null | undefined - (allowNullableObjectfalse の場合) - **自動修正** を提供します。
    • null/undefined をチェックするように条件を変更する(maybeObjmaybeObj != null
  • boolean | null | undefined - 以下の提案を提供します
    • nullish値を明示的にfalseとして扱う (maybeBoolmaybeBool ?? false)
    • true/falseをチェックする条件に変更する (maybeBoolmaybeBool === true)
  • string | null | undefined - 以下の提案を提供します
    • null/undefinedをチェックする条件に変更する (maybeStrmaybeStr != null)
    • nullish値を明示的に空文字列として扱う (maybeStrmaybeStr ?? "")
    • 値を明示的にbooleanにキャストする (maybeStrBoolean(maybeStr))
  • number | null | undefined - 以下の提案を提供します
    • null/undefinedをチェックする条件に変更する (maybeNummaybeNum != null)
    • nullish値を明示的に0として扱う (maybeNummaybeNum ?? 0)
    • 値を明示的にbooleanにキャストする (maybeNumBoolean(maybeNum))
  • any および unknown - 以下の提案を提供します
    • 値を明示的にbooleanにキャストする (valueBoolean(value))

使用しないほうが良い場合

論理条件で偽値の非boolean値が使用されることによるバグが発生する可能性が低いプロジェクトの場合は、このルールを有効にする必要はありません。

そうでない場合、このルールは論理チェックで厳密な比較を要求するため、かなり厳格になります。より正確なbooleanロジックよりも簡潔なチェックを好む場合、このルールはあなたには向いていないかもしれません。


型チェックされたlintルールは、従来のlintルールよりも強力ですが、型チェックされたlintの設定も必要になります。型チェックされたルールを有効にした後にパフォーマンスの低下が発生する場合は、パフォーマンスのトラブルシューティングを参照してください。

リソース