跳至主要内容

no-confusing-void-expression

要求类型为 void 的表达式出现在语句位置。

🔒

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

🔧

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

💡

此规则报告的一些问题可以通过编辑器 建议 手动修复。

💭

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

TypeScript 中的 void 指的是一个应该被忽略的函数返回值。尝试使用 void 类型的值,例如将调用函数的结果存储在变量中,通常是程序员错误的迹象。即使正确使用,void 也可能对其他开发人员造成误解。

此规则阻止 void 类型表达式在误导性位置使用,例如分配给变量、作为函数参数提供或从函数返回。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-confusing-void-expression": "error"
}
};

在游乐场中尝试此规则 ↗

示例

// somebody forgot that `alert` doesn't return anything
const response = alert('Are you sure?');
console.log(alert('Are you sure?'));

// it's not obvious whether the chained promise will contain the response (fixable)
promise.then(value => window.postMessage(value));

// it looks like we are returning the result of `console.error` (fixable)
function doSomething() {
if (!somethingToDo) {
return console.error('Nothing to do!');
}

console.log('Doing a thing...');
}
在游乐场中打开

选项

此规则接受以下选项

type Options = [
{
ignoreArrowShorthand?: boolean;
ignoreVoidOperator?: boolean;
},
];

const defaultOptions: Options = [
{ ignoreArrowShorthand: false, ignoreVoidOperator: false },
];

ignoreArrowShorthand

将每个箭头函数简写表达式都用大括号括起来可能不理想。尤其是在使用 Prettier 格式化程序时,它会将此类代码扩展到 3 行而不是 1 行。

启用此选项后,其他正确代码的示例

promise.then(value => window.postMessage(value));
在游乐场中打开

ignoreVoidOperator

可能更希望只使用一些不同的语法来明确标记对 void 表达式的令人困惑但有效的用法。此选项允许明确用 void 运算符包装的 void 表达式。只要其他开发人员知道这种代码风格,这有助于避免混淆。

此选项还会更改针对常见情况的自动修复,以使用void运算符。它还会启用一个建议修复,以使用void运算符包装每个报告问题的 void 表达式。

启用此选项后,其他正确代码的示例

// now it's obvious that we don't expect any response
promise.then(value => void window.postMessage(value));

// now it's explicit that we don't want to return anything
function doSomething() {
if (!somethingToDo) {
return void console.error('Nothing to do!');
}

console.log('Doing a thing...');
}

// we are sure that we want to always log `undefined`
console.log(void alert('Hello, world!'));
在游乐场中打开

何时不使用它

可以通过转到函数的定义或在 IDE 中悬停在函数上,来检查函数的返回类型。如果您不关心在实际代码中明确 void 类型,则不要使用此规则。此外,如果您强烈偏好简洁的编码风格,而不是任何对void相关错误的恐惧,那么您可以避免使用此规则。


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

资源