非null断言运算符不起作用

时间:2019-10-04 17:24:35

标签: javascript angular typescript ionic4

运行时错误:

  

TypeError:无法读取未定义的属性“ id”

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。但是仍然会出现上述错误。有任何线索吗?

2 个答案:

答案 0 :(得分:1)

non-null assertion operator不会不会确保您的数据“不正确”不会出错。
它适用于类型,不适用适用于实际数据。
只是用于创建/调整类型。

但是,如果您只想获取undefined(因此不会抛出错误),以防projects[0]不存在,则可以使用optional chaining operator,它将落入 3.7

因此,您将可以像这样使用它:

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

如果projects[0]undefined,则整个表达式的结果将为undefined,并且不会出错。

答案 1 :(得分:1)

像注释中提到的那样,空断言运算符。...该运算符告诉编译器此值在运行时肯定具有一个值,因此在运行时会发生错误。

所以是错误。...

  

TypeError:无法读取未定义的属性“ id”

显然然后...

this.authenticationProvider.member.projects[0]

undefined。好的,如果没有,它将通过,因为您没有检查数组的长度:

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)