-2

我正在寻找安全导航运算符的替代品,因为我的打字稿版本是 3.2。如果我必须检查 3 到 4 个键,我的代码会变得非常冗长。

假设我想检查Obj.key1.key2,key3然后我的代码是这样的

if((Obj != undefined || Obj!= null)&&
   (Obj.key1 != undefined || Obj.key!= null)&&
   (Obj.key1.key2 != undefined || Obj.key1.key2!= null)&&
   (Obj.key1.key2.key3 != undefined || Obj.key1.key2.key3!= null)&&
   Obj.key1.key2.key3 == some_value){
    //do something...
}
4

2 回答 2

0

此功能在MDN和其他ECMAScript 文档中称为“可选链接” ,已于 2019 年 12 月移至第 4 阶段(准备好包含) ,并作为 ES2020 的一部分发布。根据 caniuse.com 的数据,截至 2021 年 10 月,目前全球浏览器支持率为 90.86%

如前所述,并在其问题Microsoft/TypeScript#16中讨论过,Typescript 对可选链接的支持已于 2019 年 11 月 5 日发布——大约是两年前的这个答案。编译解决方案也存在于Webpack 5或 Babel 的ES2020 环境中。因此,对于大多数开发人员来说,采用现代版本的 TypeScript 工具比使用替代实现更有意义。

如果您严格无法使用现代工具,则需要一个辅助方法;作为一种语言特性,可选链不能直接填充。许多通用库中存在经过测试的兼容替代方案:

于 2021-10-04T18:05:17.533 回答
-1

我制作了这个功能,它可以用作打字稿版本 <3.7 的安全导航运算符的替代品

/*
  This function is to validate if Object is accessible or not as well as returns its value if it is accessible.
  it will return false if Object is not accessible (if value is null or undefined)
  If Object is accessible then it will return its value.

  Example: if I want to check that is "obj.key1.key2" is accessible and I want to put check on its value.
  if (isAccessible(obj,["key1","key2"]) == some_value){
    ...do something...
  }

  no need to check for null and undefined for each key.

  NOTE: this function is alternate of "SAFE NAVIGATOR OPERATOR (?)" of typescript which is not supported in versions <3.7
*/

isAccessible(data, keys, start=0) {
  if (start == 0 && (data == null || data == undefined)) {
    console.warn("data",data);
    return data;
  } else {
    if (data[keys[start]] == null || data[keys[start]] == undefined) {
      console.warn("Object valid till", keys.slice(0,start),keys[start],"undefined");
      return data[keys[start]];
    } else {
      if (start + 1 >= keys.length) {
        // console.log("output",data[keys[start]]);
        return data[keys[start]];
      }
      return this.isAccessible(data[keys[start]], keys, start + 1);
    }
  }
}
于 2021-10-04T16:29:58.083 回答