ChatGPT解决这个技术问题 Extra ChatGPT

为什么 TSLint 和 JSLint 报告空块?

有时,我会收到 TSLint 错误“块为空”。例如,当我将无操作回调传递给函数时,就会发生这种情况:

doSomething(() => {});

从我读到的内容来看,JSLint 显然也是这样做的,但我没有验证这一点。

我发现这些用法完全有效,所以我试图找到一个为什么空块被认为是坏的原因。但我唯一能找到的(例如在 this answer 中)是添加 return; 以避免错误的说明。这不是我想要在每个空回调中执行的操作。

为什么 TSLint 将空块上方报告为问题?有什么理由我不应该禁用检查吗?

从来没有使用过;只是大声思考:TSLint 抱怨的时间可能是它认为函数应该返回一个值而您的无操作函数没有这样做吗?您也许可以定义一个显式的无操作函数,并在这种调用中传递它的名称。
@TripeHound 不,即使我为回调指定了明确的 (() => void) 类型,TSLint 也会抱怨。关于 noop:我刚刚发现 lodash 已经定义了一个:_.noop。这是迄今为止最干净的解决方案...
@danwellman 是的,但这会将返回类型从 void 更改为空对象。
转到以下页面以查看空函数错误:stackoverflow.com/a/70746269/7680511
转到以下页面以查看空函数错误:stackoverflow.com/a/70746269/7680511

b
basarat

为什么 TSLint 将空块上方报告为问题

为了防止错误。可能函数忘记填写了。推荐 () => undefined 作为 noop。

更多的

如果您想禁用它,只需将 "no-empty": false, 添加到您的 tslint.json(全局禁用)或使用 /* tslint:disable:no-empty */ 注释内联禁用它。


我想我不想让 TSLint 告诉我我错过了填写函数体,这就是我要测试的内容。因此,如果此检查确实没有其他用处,我宁愿禁用它,也不愿在每个回调中使用 () => undefined。但我想这是一个品味问题。
澄清一下,你能具体说明“错误”是什么意思吗?它只是空的函数体吗?
就像 basarat 所说,一个错误可能是你忘记实现某些东西,尽管按照惯例,你希望有一天实现的每个函数在使用时都应该抛出 NotImplemented
s
spacedev

如果您觉得在某些情况下不想使用回调,您可以修改代码

doSomething(() => {});

doSomething(() => undefined);

将 () => {} 替换为此意味着您不关心此回调。和明确的类型转换将避免影响。

祝你好运。


F
Fenton

与所有检查一样,您对它们是否在帮助您拥有最终判断。您可以使用以下选项之一关闭此 TSLint 检查。

禁用 tslint.json 中的规则

//...
"no-empty": false,
//...

禁用文件中的规则:

/* tslint:disable:no-empty */

如果将来某个时候您发现一个导致您出现问题的空块,您可以随时重新打开它。


E
Estus Flask

一种抑制错误并指定空块是故意的方法是临时禁用规则:

// tslint:disable-next-line:no-empty
doSomething(() => {});

或使其非空:

doSomething(() => {/**/});

第二个建议似乎很不合适。
T
Tomas Varga

tslint v5.10.0 仅针对这种情况向 "no-empty" 引入了 "allow-empty-functions" 选项;
还有 "allow-empty-catch"(在 v5.5.0 中引入)可能有用:

"no-empty": [true, "allow-empty-functions", "allow-empty-catch"]