非空断言能否与三元运算符结合?Angular路由参数写法合理性探讨
问题2:Angular路由参数获取的三元写法是否有意义?
这种写法完全没有意义,而且隐藏着严重的运行时风险。
为什么这么说?你用了一连串的非空断言:this!.route!.snapshot!.parent!.paramMap.get('id')。这里的每一个!都在强制告诉TS“这个属性肯定存在”,但运行时如果其中某一步(比如parent实际是null),代码会在this!.route!.snapshot!.parent!这一步直接抛出TypeError: Cannot read properties of null (reading 'paramMap'),程序直接崩溃,根本到不了后面的三元判断环节。
换句话说,只要链式调用里有一个环节是null/undefined,你的三元逻辑永远不会被执行,那写这个三元运算符就等于白写,起不到任何兜底的作用。
那正确的写法应该是什么?用**可选链操作符(?.)代替非空断言,再配合空值合并运算符(??)**来设置默认值:
const id = this.route?.snapshot?.parent?.paramMap.get('id') ?? '-1';
解释下这两个操作符的作用:
- 可选链
?.会安全地访问嵌套属性,只要其中某一步是null/undefined,整个表达式就会返回undefined,不会抛出错误。 - 空值合并运算符
??会在左边的值是null/undefined时,返回右边的默认值'-1',完美实现你想要的兜底效果。
总结一下:非空断言!要谨慎使用,只有当你能绝对保证值不会是null/undefined的时候再用;大多数场景下,可选链+空值合并是更安全、更优雅的选择。
内容的提问来源于stack exchange,提问作者phasemaster
相关产品推荐
相关产品推荐

