我基本上是在尝试检查lote.projeto.id_projeto == 123
因此,如果未定义子属性,则会产生cannot read property
错误。
使用此不良代码检查每个子属性似乎是避免这些错误的唯一方法。
if(lote['projeto']){
if(lote['projeto']['id_projeto']){
if(lote['projeto']['id_projeto'] == 123){
// ...
}
}
}
有没有更简单/更清洁的方法?
答案 0 :(得分:4)
尝试使用&&
运算符:
if (lote['projeto']
&& lote['projeto']['id_projeto'] == 123) {
// ...
}
语法: expr1 && expr2
如果 expr1 可以转换为true, 返回 expr2 ;否则,返回 expr1 。
答案 1 :(得分:1)
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)