Any expression being used as a condition must be able to evaluate as truthy or falsy in order to be considered "necessary". Conversely, any expression that always evaluates to truthy or always evaluates to falsy, as determined by the type of the expression, is considered unnecessary and will be flagged by this rule.
The following expressions are checked:
- Arguments to the
&&
,||
and?:
(ternary) operators - Conditions for
if
,for
,while
, anddo-while
statements.
Examples of incorrect code for this rule:
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) {
}
}
Examples of correct code for this rule:
function head<T>(items: T[]) {
// Necessary, since items.length might be 0
if (items.length) {
return items[0].toUpperCase();
}
}
function foo(arg: 'bar' | 'baz') {
// Necessary, since foo might be ''.
if (arg) {
}
}
Accepts an object with the following options:
ignoreRhs
(defaultfalse
) - doesn't check if the right-hand side of&&
and||
is a necessary condition. For example, the following code is valid with this option on:
function head<T>(items: T[]) {
return items.length && items[0].toUpperCase();
}
The main downside to using this rule is the need for type information.
-
ESLint: no-constant-condition - this rule is essentially a stronger versison
-
strict-boolean-expression - a stricter alternative to this rule.