TypeScript 3.7以下版本Safe Navigation Operator的替代方案有哪些?
TypeScript 3.2 版本可选链操作符替代方案
TS 3.7 版本才正式支持安全导航操作符(可选链 ?.),3.2 版本无法直接使用该特性,以下是几种可直接落地的替代方案,解决多层嵌套对象属性校验代码冗长的问题。
- 方案1:自定义通用嵌套属性获取工具函数
封装可复用的工具函数,传入目标对象、属性路径即可自动逐层校验属性是否存在,代码如下:
/** * 获取嵌套对象的属性值 * @param obj 目标对象 * @param path 属性路径,支持"key1.key2.key3"格式 * @param defaultValue 属性不存在时返回的默认值 */ function getNestedValue(obj: any, path: string, defaultValue?: any) { const keys = path.split('.'); let current = obj; for (const key of keys) { if (current == null) return defaultValue; current = current[key]; } return current ?? defaultValue; }
使用时原来的多层判断可以直接简化为:
if (getNestedValue(Obj, 'key1.key2.key3') === some_value) { // 执行业务逻辑 }
- 方案2:用短路求值简化原生判断
如果不想额外封装工具函数,可以利用&&短路特性+== null的简化判断优化原有代码:
提示:
x == null等价于同时判断x === undefined和x === null,不需要分开写两次校验。
简化后的判断代码:
if (Obj && Obj.key1 && Obj.key1.key2 && Obj.key1.key2.key3 === some_value) { // 执行业务逻辑 }
该方案适合临时使用、嵌套层数不多的场景,缺点是层级过多时可读性会下降。
- 方案3:使用lodash的
get方法
如果项目已经引入了lodash工具库,可以直接调用现成的_.get方法,功能和自定义工具函数一致:
import _ from 'lodash'; if (_.get(Obj, 'key1.key2.key3') === some_value) { // 执行业务逻辑 }
还可以传入第三个参数作为属性不存在时的默认返回值,比如_.get(Obj, 'key1.key2.key3', 0)。
内容的提问来源于stack exchange,提问作者Nilesh Pal
相关产品推荐
相关产品推荐

