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...');
}
在游乐场中打开// just a regular void function in a statement position
alert('Hello, world!');
// this function returns a boolean value so it's ok
const response = confirm('Are you sure?');
console.log(confirm('Are you sure?'));
// now it's obvious that `postMessage` doesn't return any response
promise.then(value => {
window.postMessage(value);
});
// now it's explicit that we want to log the error and return early
function doSomething() {
if (!somethingToDo) {
console.error('Nothing to do!');
return;
}
console.log('Doing a thing...');
}
// using logical expressions for their side effects is fine
cond && console.log('true');
cond || console.error('false');
cond ? console.log('true') : console.error('false');
在游乐场中打开选项
此规则接受以下选项
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。如果您在启用类型检查规则后遇到性能下降,请参阅性能故障排除。