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"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 错误
- ✅ 正确
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
在游乐场中打开选项
此规则接受以下选项
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 本质上会从类型中删除 undefined
和 null
。这意味着当此规则检查变量的类型时,它将无法判断该变量可能是 null
或 undefined
,这实际上使此规则毫无用处。
您应该使用 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。如果您在启用类型检查规则后遇到性能下降,请参阅 性能故障排除。