Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 非空断言运算符不工作_Javascript_Angular_Typescript_Ionic4 - Fatal编程技术网

Javascript 非空断言运算符不工作

Javascript 非空断言运算符不工作,javascript,angular,typescript,ionic4,Javascript,Angular,Typescript,Ionic4,运行时错误: TypeError:无法读取未定义的属性“id” 你能告诉我如何避免上述错误吗?我用过。但是,它仍然给出了上述错误。有什么线索吗?如果数据“不正确”,非空断言运算符不能确保不会出现错误。 它对类型有效,而不是对实际数据有效。 这只是为了创建/调整您的类型 但是,如果您只想获得undefinedthus,那么在项目[0]不存在的情况下不会抛出错误,您可以使用,它将在3.7中着陆 因此,您可以这样使用它: 此.authenticationProvider.member?.project

运行时错误:

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

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

如果数据“不正确”,非空断言运算符不能确保不会出现错误。 它对类型有效,而不是对实际数据有效。 这只是为了创建/调整您的类型

但是,如果您只想获得undefinedthus,那么在项目[0]不存在的情况下不会抛出错误,您可以使用,它将在3.7中着陆

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

此.authenticationProvider.member?.projects[0]?.id
如果项目[0]未定义,则整个表达式的计算结果将为未定义,并且不会出现任何错误。

如注释中所述,空断言运算符。。。。运算符告诉编译器此值在运行时肯定有一个值,因此在运行时会发生错误

所以错误

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

显然,那么

this.authenticationProvider.member.projects[0]
没有定义。这很好,如果您有,它会通过,因为您没有检查数组的长度:

if (this.authenticationProvider.member.projects != null) 
因此,如果项目为[],则代码通过

如果this.authenticationProvider.member.projects包含检查它是否存在,我会这样做,包括null、undefined和false。然后,还要检查数组中是否确实存在对象,因此您的if语句可以如下所示:

if (this.authenticationProvider.member.projects && this.authenticationProvider.member.projects.length)
如果您不确定该成员是否存在,您应该对其进行额外检查

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

运算符告诉编译器此值在运行时肯定有一个值。然而,TS只在编译时进行检查,在运行时类型系统不在适当的位置,因为运行的只是编译后的JS代码。你说相信我,会有价值的,但没有价值;博士typechecker告诉您它无法确定表达式是否为空/未定义。你告诉它,我确信它不是空的/未定义的。它是未定义的。它在运行时崩溃。您感到困惑。@VLAZ如何避免此错误?@ASDFGerte如何避免此错误?请在运行时检查null。如果您这样做,this.authenticationProvider.member.projects.length{}是否可以工作?如果您看到我的代码,我已经这样做了。i、 e.如果此文件为.authenticationProvider.member.projects!=假设您有一个数组const arr=[];啊!==null将始终为真。问题是您正在尝试访问将未定义的arr[0].prop。通过执行if arr.length{},您可以确保数组至少有一个元素,这样您就可以更安全地访问arr[0].prop。这样如何?如果此.authenticationProvider.member!=null&&this.authenticationProvider.member.projects!=null&&this.authenticationProvider.member.projects.length>0在我看来,this.authenticationProvider.member.projects!=null是多余的。另外,请记住,未定义!=null等于false。感谢您的解释,它在不依赖库的情况下工作。i、 e TS版本和etcNo问题,很高兴我能帮助澄清问题:
if (this.authenticationProvider.member && 
    this.authenticationProvider.member.projects && 
    this.authenticationProvider.member.projects.length)