跳至主要内容

no-unnecessary-condition

禁止类型始终为真或始终为假的条件语句。

🔒

"plugin:@typescript-eslint/strict-type-checked" 中扩展 ESLint 配置 可以启用此规则。

🔧

此规则报告的一些问题可以通过 --fix ESLint 命令行选项 自动修复。

💭

此规则需要 类型信息 才能运行。

任何用作条件的表达式都必须能够评估为真或假,才能被视为“必要”。相反,任何始终评估为真或始终评估为假的表达式(由表达式的类型决定)都被视为不必要,并且将被此规则标记。

以下表达式将被检查

  • &&||?:(三元)运算符的参数
  • ifforwhiledo-while 语句的条件
  • 可选链表达式的基本值
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-unnecessary-condition": "error"
}
};

在游乐场中尝试此规则 ↗

示例

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
在游乐场中打开

选项

此规则接受以下选项

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

{ allowConstantLoopConditions: true } 的正确代码示例

while (true) {}
for (; true; ) {}
do {} while (true);
在游乐场中打开

allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing

如果将其设置为 false,则该规则将对每个 tsconfig.json 文件(或 strict)没有将 strictNullChecks 编译器选项设置为 true 的文件报错。

没有 strictNullChecks,TypeScript 本质上会从类型中删除 undefinednull。这意味着当此规则检查变量的类型时,它将无法判断该变量可能是 nullundefined,这实际上使此规则毫无用处。

您应该使用 strictNullChecks 来确保代码库的完全类型安全。

如果由于某种原因您无法打开 strictNullChecks,但仍然想使用此规则 - 您可以使用此选项来允许它 - 但请注意,此规则的行为在编译器选项关闭的情况下是未定义的。如果您使用此选项,我们将不接受错误报告。

何时不使用它

如果您的项目类型不准确,例如正在转换为 TypeScript 或容易受到 控制流分析中的权衡 的影响,则可能难以为此规则启用特别不安全的代码区域。您可能需要考虑使用 ESLint 禁用注释 针对这些特定情况,而不是完全禁用此规则。

此规则有一个已知的边缘情况,即在函数调用中修改的条件(作为副作用)触发。这是由于 TypeScript 类型缩小的限制。有关详细信息,请参阅 #9998。我们建议在这些情况下使用 类型断言

let condition = false as boolean;

const f = () => (condition = true);
f();

if (condition) {
}
  • ESLint:no-constant-condition - no-unnecessary-condition 本质上是 no-constant-condition 的更强大版本,但需要类型信息。
  • strict-boolean-expressions - no-unnecessary-condition 的更具意见性的版本。strict-boolean-expressions 强制执行特定的代码风格,而 no-unnecessary-condition 则与正确性有关。


类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除

资源