提问人:Prasad Parab 提问时间:7/17/2022 更新时间:7/17/2022 访问量:502
esLint 给出错误 for-in 的主体应该包装在 if 语句中,以从原型中过滤不需要的属性
esLint gives error The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype
问:
我正在将 esLint 用于我的 angular 项目,它为以下代码抛出错误
private calculateFieldValue(value: any): any {
let isEmptyObject = false;
if (value && Array.isArray(value) && value.length === 1 && value[0]) {
for (const subAttr in value[0]) {
if (value[0].hasOwnProperty(subAttr)) {
if (value[0][subAttr]) {
break;
}
}
isEmptyObject = true;
}
}
return isEmptyObject ? null : value;
}
它抛出了错误:
error for-in 的正文应包装在 if 语句中,以 从原型 Guard-for-In 中过滤不需要的属性
答:
2赞
CertainPerformance
7/17/2022
#1
虽然你有一个检查,但它并没有包围整个循环体; 即使没有该属性,也会运行。linter 希望你只在成功时在正文中运行语句。hasOwnProperty
isEmptyObject = true;
value[0]
hasOwnProperty
for (const subAttr in value[0]) {
if (value[0].hasOwnProperty(subAttr)) {
if (value[0][subAttr]) {
break;
}
isEmptyObject = true;
}
}
我也强烈反对使用 - 这通过有效地禁用许多类型的类型检查而违背了 TypeScript 的目的。您将返回数组或 ,因此请使用泛型来指示数组的类型,而不是使用 .any
null
any
一个更好的方法是用来查看是否有任何值是真实的 - 毕竟,你根本不关心键,只关心值。Object.values
function getSubarrayObjectWithTruthyProperty<T extends unknown>(value: Array<T> | unknown) {
if (value && Array.isArray(value) && value.length === 1) {
const item: unknown = value[0];
if (item && typeof item === 'object' && Object.values(item).some(Boolean)) {
return value as T;
}
}
return null;
}
评论
if (value && Array.isArray(value) && value.length === 1 && value[0])
if (value //...
value
Array.isArray(value)