strict-boolean-expressions
ブール式での特定の型の使用を禁止します。
このルールによって報告される一部の問題は、 --fix
ESLint コマンドラインオプションで自動的に修正できます。.
このルールによって報告される一部の問題は、エディターの 提案によって手動で修正できます。.
このルールを実行するには 型情報 が必要です。
ブール値が期待される式で、ブール型以外の型の使用を禁止します。boolean
型と never
型は常に許可されます。ブール値のコンテキストで安全とみなされる追加の型は、オプションで構成できます。
次のノードはブール式とみなされ、その型がチェックされます。
- 論理否定演算子(
!arg
)の引数。 - 条件式(
cond ? x : y
)の条件。 if
、for
、while
、およびdo-while
ステートメントの条件。- 論理二項演算子(
lhs || rhs
およびlhs && rhs
)のオペランド。- 右側のオペランドが別のブール式の派生でない場合は無視されます。これは、ブール演算子をその短絡動作のために使用できるようにするためです。
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();
}
プレイグラウンドで開く// nullable values should be checked explicitly against null or undefined
let num: number | undefined = 0;
if (num != null) {
console.log('num is defined');
}
let str: string | null = null;
if (str != null && !str) {
console.log('str is empty');
}
function foo(bool?: boolean) {
if (bool ?? false) {
bar();
}
}
// `any` types should be cast to boolean explicitly
const foo = (arg: any) => (Boolean(arg) ? 1 : 0);
プレイグラウンドで開くオプション
このルールは次のオプションを受け入れます。
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 つ(0
と NaN
)しかないため、これは安全です。明示的な 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.json
に strictNullChecks
コンパイラオプション(または strict
)が true
に設定されていないすべてのファイルでエラーになります。
strictNullChecks
がない場合、TypeScript は基本的に型から undefined
と null
を消去します。これは、このルールが変数から型を検査するとき、**変数が null
または undefined
である可能性があることを判別できない**ことを意味し、このルールは実質的により役に立たなくなります。
コードベースで完全な型安全性を確保するには、strictNullChecks
を使用する必要があります。
何らかの理由で strictNullChecks
をオンにできないが、それでもこのルールを使用したい場合は、このオプションを使用して許可することができますが、このルールがコンパイラオプションがオフになっている場合の動作は *未定義* であることを知っておいてください。このオプションを使用している場合は、バグレポートを受け付けません。
修正と提案
このルールは、ブール値コンテキストの特定の型に対して、次の修正と提案を提供します。
boolean
- 常に許可されます - 修正は必要ありません。string
- (allowString
がfalse
の場合) - 次の提案を提供します。- 文字列の長さをチェックするように条件を変更する(
str
→str.length > 0
) - 空文字列をチェックするように条件を変更する(
str
→str !== ""
) - 値を明示的にブール値にキャストする(
str
→Boolean(str)
)
- 文字列の長さをチェックするように条件を変更する(
number
- (allowNumber
がfalse
の場合)array.length
の場合 - **自動修正** を提供します。- 0 をチェックするように条件を変更する(
array.length
→array.length > 0
)
- 0 をチェックするように条件を変更する(
- その他の数値の場合 - 次の提案を提供します。
- 0 をチェックするように条件を変更する(
num
→num !== 0
) - NaN をチェックするように条件を変更する(
num
→!Number.isNaN(num)
) - 値を明示的にブール値にキャストする(
num
→Boolean(num)
)
- 0 をチェックするように条件を変更する(
object | null | undefined
- (allowNullableObject
がfalse
の場合) - **自動修正** を提供します。- null/undefined をチェックするように条件を変更する(
maybeObj
→maybeObj != null
)
- null/undefined をチェックするように条件を変更する(
boolean | null | undefined
- 以下の提案を提供します- nullish値を明示的にfalseとして扱う (
maybeBool
→maybeBool ?? false
) - true/falseをチェックする条件に変更する (
maybeBool
→maybeBool === true
)
- nullish値を明示的にfalseとして扱う (
string | null | undefined
- 以下の提案を提供します- null/undefinedをチェックする条件に変更する (
maybeStr
→maybeStr != null
) - nullish値を明示的に空文字列として扱う (
maybeStr
→maybeStr ?? ""
) - 値を明示的にbooleanにキャストする (
maybeStr
→Boolean(maybeStr)
)
- null/undefinedをチェックする条件に変更する (
number | null | undefined
- 以下の提案を提供します- null/undefinedをチェックする条件に変更する (
maybeNum
→maybeNum != null
) - nullish値を明示的に0として扱う (
maybeNum
→maybeNum ?? 0
) - 値を明示的にbooleanにキャストする (
maybeNum
→Boolean(maybeNum)
)
- null/undefinedをチェックする条件に変更する (
any
およびunknown
- 以下の提案を提供します- 値を明示的にbooleanにキャストする (
value
→Boolean(value)
)
- 値を明示的にbooleanにキャストする (
使用しないほうが良い場合
論理条件で偽値の非boolean値が使用されることによるバグが発生する可能性が低いプロジェクトの場合は、このルールを有効にする必要はありません。
そうでない場合、このルールは論理チェックで厳密な比較を要求するため、かなり厳格になります。より正確なbooleanロジックよりも簡潔なチェックを好む場合、このルールはあなたには向いていないかもしれません。
関連ルール
- no-unnecessary-condition - 条件で常に真または常に偽になる値を報告する類似のルール
型チェックされたlintルールは、従来のlintルールよりも強力ですが、型チェックされたlintの設定も必要になります。型チェックされたルールを有効にした後にパフォーマンスの低下が発生する場合は、パフォーマンスのトラブルシューティングを参照してください。