no-unnecessary-condition
常に真または常に偽となる型を持つ条件式を禁止します。
拡張 "plugin:@typescript-eslint/strict-type-checked"
を ESLint 設定 で有効にすると、このルールが有効になります。
このルールによって報告される問題の中には、 --fix
ESLint コマンドラインオプション.
💭 このルールを実行するには、 型情報
が必要です。
条件として使用される式は、すべて「必要」と見なされるためには真または偽として評価できる必要があります。逆に、式の型によって決定されるように、常に真または常に偽と評価される式は不要と見なされ、このルールによってフラグが立てられます。
- 次の式がチェックされます
&&
、||
、および?:
(三項)演算子への引数if
、for
、while
、およびdo-while
ステートメントの条件
module.exports = {
"rules": {
"@typescript-eslint/no-unnecessary-condition": "error"
}
};
.eslintrc.cjs
playground でこのルールを試す ↗
- 例
- ❌ 間違い
function head<T>(items: T[]) {
// items can never be nullable, so this is unnecessary
if (items) {
return items[0].toUpperCase();
}
}
function foo(arg: 'bar' | 'baz') {
// arg is never nullable or empty string, so this is unnecessary
if (arg) {
}
}
function bar<T>(arg: string) {
// arg can never be nullish, so ?. is unnecessary
return arg?.length;
}
// Checks array predicate return types, where possible
[
[1, 2],
[3, 4],
].filter(t => t); // number[] is always truthy
✅ 正しいfunction head<T>(items: T[]) {
// Necessary, since items.length might be 0
if (items.length) {
return items[0].toUpperCase();
}
}
function foo(arg: string) {
// Necessary, since foo might be ''.
if (arg) {
}
}
function bar(arg?: string | null) {
// Necessary, since arg might be nullish
return arg?.length;
}
[0, 1, 2, 3].filter(t => t); // number can be truthy or falsy
✅ 正しいPlayground で開く
オプション
type Options = [
{
/** Whether to ignore constant loop conditions, such as `while (true)`. */
allowConstantLoopConditions?: boolean;
/** Whether to not error when running with a tsconfig that has strictNullChecks turned. */
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing?: boolean;
},
];
const defaultOptions: Options = [
{
allowConstantLoopConditions: false,
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
},
];
このルールは以下のオプションを受け入れます
allowConstantLoopConditions
while (true) {}
for (; true; ) {}
do {} while (true);
✅ 正しい{ allowConstantLoopConditions: true }
の場合の正しいコードの例
allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing
これが false
に設定されている場合、ルールは tsconfig.json
に strictNullChecks
コンパイラオプション (または strict
) が true
に設定されていないすべてのファイルでエラーが発生します。
strictNullChecks
がない場合、TypeScript は本質的に型から undefined
と null
を消去します。これは、このルールが変数から型を検査するときに、**変数が null
または undefined
になる可能性があることを判別できない** ことを意味し、本質的にこのルールを役に立たなくします。
コードベースで完全な型安全性を確保するには、strictNullChecks
を使用する必要があります。
何らかの理由で strictNullChecks
をオンにできないが、それでもこのルールを使用したい場合は、このオプションを使用して許可できますが、このコンパイラオプションをオフにすると、このルールの動作が *未定義* であることを理解しておいてください。このオプションを使用している場合、バグレポートは受け付けません。
使用しない場合
プロジェクトが正確に型付けされていない場合、たとえば TypeScript に変換中の場合や、制御フロー分析におけるトレードオフの影響を受けやすい場合、特に型安全でないコード領域でこのルールを有効にすることが難しい場合があります。このルールを完全に無効にする代わりに、これらの特定の状況では、ESLint 無効化コメントを使用することを検討できます。
let condition = false as boolean;
const f = () => (condition = true);
f();
if (condition) {
}
このルールには、関数呼び出し内で(副作用として)変更された条件でトリガーされる既知のエッジケースがあります。これは、TypeScript の型絞り込みの制限によるものです。詳細については、#9998 を参照してください。このような場合は、型アサーションを使用することをお勧めします。
- 関連
- ESLint: no-constant-condition -
no-unnecessary-condition
は本質的にno-constant-condition
のより強力なバージョンですが、型情報が必要です。
strict-boolean-expressions -
no-unnecessary-condition
のより意見の強いバージョン。strict-boolean-expressions
は特定のコードスタイルを強制しますが、no-unnecessary-condition
は正確性に関するものです。