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

提问人:Prasad Parab 提问时间:7/17/2022 更新时间:7/17/2022 访问量:502

问:

我正在将 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 中过滤不需要的属性

Angular TypeScript eslint lint jslint

评论

1赞 mbojko 7/17/2022
顺便说一句,第一个条件 , 是多余的。对于任何虚假的,无论如何都会返回 false。if (value && Array.isArray(value) && value.length === 1 && value[0])if (value //...valueArray.isArray(value)

答:

2赞 CertainPerformance 7/17/2022 #1

虽然你有一个检查,但它并没有包围整个循环体; 即使没有该属性,也会运行。linter 希望你只在成功时在正文中运行语句。hasOwnPropertyisEmptyObject = true;value[0]hasOwnProperty

for (const subAttr in value[0]) {
    if (value[0].hasOwnProperty(subAttr)) {
        if (value[0][subAttr]) {
            break;
        }
        isEmptyObject = true;
    }
}

我也强烈反对使用 - 这通过有效地禁用许多类型的类型检查而违背了 TypeScript 的目的。您将返回数组或 ,因此请使用泛型来指示数组的类型,而不是使用 .anynullany

一个更好的方法是用来查看是否有任何值是真实的 - 毕竟,你根本不关心键,只关心值。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;
}