Angular 11严格模式如何在循环中按属性比较对象

问题描述

我正在尝试将库升级到版本 11,严格模式。当未强制执行严格且在 angular 的先前版本中时,可以在此处找到代码https://stackblitz.com/edit/angular-ivy-fsnmjo?file=src%2Fapp%2Fmodel%2Fmember.ts。我在 Member 类中定义了一个方法来确定 2 个对象是否“相等”。

在我的应用程序中,如果某些属性匹配,则成员是相等的。

我尝试了两种不同的方法解决这个问题,“equalsV1”和“equalsV2”。

equalsV1 产生以下错误

src/app/model/member.ts 中的错误 (17:17) 元素隐式具有 'any' 类型,因为类型 'string' 的表达式不能用于索引类型 'Member'。在“Member”类型上找不到参数为“string”类型的索引签名。

equalsV2 产生以下错误

src/app/model/member.ts 中的错误 (32:17) 键入“Extract' 不能用于索引类型 'Member'。

我的问题是如何在不明确引用每个属性的情况下按属性将对象与对象进行比较,即 memberTocompare.id === this.id 不是可接受的答案。

解决方法

答案是更改以下内容:

if (memberToCompare[key] !== value) {
                return false;
            }

if ((memberToCompare as any)[key] !== value) {
                return false;
            }

我得到了 Thayne 对 Element implicitly has an 'any' type because type 'Window' has no index signature? 的回答的线索

我的完整代码答案在这里https://stackblitz.com/edit/angular-ivy-2tjpxr?file=src%2Fapp%2Fmodel%2Fmember.ts

如果有人有更好的解决方案,我很乐意看到。

,

好吧,你可以和那些忠实的JSON.stringify

let obj1 = {t: 1};
let obj2 = {t: 1};
let obj3 = {t: 2};
let obj4 = {t: 1,x: 1};
let obj5 = {t: 1,x: () => {}};

let result1 = obj1 == obj2;
let result2 = JSON.stringify(obj1) === JSON.stringify(obj2);
let result3 = JSON.stringify(obj1) === JSON.stringify(obj3);
let result4 = JSON.stringify(obj1) === JSON.stringify(obj4);
// note that this is true as methods are not string-ified
let result5 = JSON.stringify(obj1) === JSON.stringify(obj5);

console.log({result1,result2,result3,result4,result5})