You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:09:00