检查子属性是否存在的更干净方法

时间:2019-12-12 12:52:27

标签: javascript angular typescript

我基本上是在尝试检查lote.projeto.id_projeto == 123

因此,如果未定义子属性,则会产生cannot read property错误。

使用此不良代码检查每个子属性似乎是避免这些错误的唯一方法。

if(lote['projeto']){
  if(lote['projeto']['id_projeto']){
    if(lote['projeto']['id_projeto'] == 123){
      // ...
    }
  }
}

有没有更简单/更清洁的方法?

3 个答案:

答案 0 :(得分:4)

尝试使用&&运算符:

if (lote['projeto']      
   && lote['projeto']['id_projeto'] == 123) {
   // ...        
}

As mdn says about &&

  

语法: expr1 && expr2
  如果 expr1 可以转换为true,   返回 expr2 ;否则,返回 expr1

答案 1 :(得分:1)

  1. 在测试相等性之前,您不需要测试该属性是否真实
  2. 如果您的目标是测试值(相对于测试现有属性,以便可以在else中进行操作,则可以在Typescript 3.7中使用新的Optional Chaining
if (lote.projeto?.id_projeto == 123) {
}

如果您的属性名称是在运行时确定的,则可以使用“可选元素访问”语法

if (lote?.['projeto']?.['id_projeto'] == 123) {
}

答案 2 :(得分:1)

Typescript 3.7带有 可选链接 的概念 从official documentation

中了解更多信息

所以,也许你可以做到

lote?.projeto?.id_projeto == 123

如果缺少任何子属性,则条件为假。

如果您使用的是较早版本的打字稿,则无法通过其他方式添加&&条件,如下所示:

(lote.projeto && lote.projeto.id_projeto && lote.projeto.id_projeto == 123)