非空断言运算符不起作用

Non-null assertion operator is not working

运行时错误:

TypeError: Cannot read property 'id' of undefined

if (!this.havingMultipleProjects) {//having only 1 project or not at all
  if (this.authenticationProvider.member.projects != null) 
this.projectProvider.projectId = this.authenticationProvider.member!.projects[0]!.id;
   }

你能告诉我如何避免上述错误吗?我用过Non-null assertion operator。但是,它仍然给出了上述错误。有什么线索吗?

non-null assertion operator不会确保如果您的数据是'incorrect'.
,您将不会收到任何错误 它适用于类型,不适用于实际数据。
它仅适用于 creating/adjusting 您的类型。

然而,如果你想在 projects[0] 不存在的情况下简单地获取 undefined(因此,不会抛出错误),你可以使用 optional chaining operator,它将降落在 3.7.

因此,您将能够像这样使用它:

this.authenticationProvider.member?.projects[0]?.id

并且如果 projects[0]undefined,整个表达式的计算结果将是 undefined,您不会得到任何错误。

就像评论中提到的,空断言运算符....运算符告诉编译器这个值在运行时肯定会有一个值,所以在运行时错误会发生。

所以错误....

TypeError: Cannot read property 'id' of undefined

很明显...

this.authenticationProvider.member.projects[0]

undefined。很好,它通过了 if 你有,因为你没有检查数组的长度:

if (this.authenticationProvider.member.projects != null) 

如果 projects[]

,那么您的代码通过

我会做 if (this.authenticationProvider.member.projects) 它包括检查它是否存在,总共涵盖 nullundefinedfalse。然后再检查数组中是否确实有一个对象,因此您的 if 语句可能看起来像:

if (this.authenticationProvider.member.projects && this.authenticationProvider.member.projects.length)

如果您不确定甚至 member 是否存在,您应该对此进行额外检查...

if (this.authenticationProvider.member && 
    this.authenticationProvider.member.projects && 
    this.authenticationProvider.member.projects.length)