Angular 8本机Typescript无崩溃,存取器速记

Angular 8本机Typescript无崩溃,存取器速记,angular,typescript,ecmascript-2017,Angular,Typescript,Ecmascript 2017,角度8: 我曾经在打字脚本方面使用过一个简短的技巧: object['accessor']['accessor']['accessor'] 得到 object.accessor.accessor.accessor 如果其中一个孩子是空的,就不会有抛出错误的风险 根据今天的ECMA脚本标准,在typescript文件中实现这一点的最佳方法是什么 编辑: 我找到了这个 b/嵌套的三元表达式似乎是最好的,但似乎很复杂 编辑2: 无论如何,这同样会导致应用程序崩溃(尽管是在组件级别) 新的安格尔规则似乎

角度8:

我曾经在打字脚本方面使用过一个简短的技巧:

object['accessor']['accessor']['accessor']

得到

object.accessor.accessor.accessor

如果其中一个孩子是空的,就不会有抛出错误的风险

根据今天的ECMA脚本标准,在typescript文件中实现这一点的最佳方法是什么

编辑:

我找到了这个

b/嵌套的三元表达式似乎是最好的,但似乎很复杂

编辑2:

无论如何,这同样会导致应用程序崩溃(尽管是在组件级别)


新的安格尔规则似乎更为严格。他们只是没有提供替代方案。

您可以简单地执行以下操作

// Sample object

const object = {
    someKey: 'First Level Value',
    accessor: {
        someKey: 'Second Level Value',
        accessor: {
            someKey: 'Third Level Value',
            accessor: 'Accessor Value'
        }
    }
};

// Using ternary expression to do conditional validation check
// Usage --> condition to check ? 'Do this if condition is true' : 'Do this if condition is false'

const accessorValue = object ? // first (?) operator
    object.accessor ? // second (?) operator
        object.accessor.accessor ? // third (?) operator
            object.accessor.accessor ? // fourth (?) operator
                object.accessor.accessor.accessor :
                null : // to match the first (?) operator
            null : // to match the second (?) operator
        null : // to match the third (?) operator
    null; // to match the fourth (?) operator

console.log(accessorValue); // Accessor Value

我更喜欢布尔表达式方法

let object = {
  accessor: {
    accessor: {
      accessor: "test"
    }
  }
}

if (object
   && object.accessor
   && object.accessor.accessor
   && object.accessor.accessor.accessor) {
  console.log(object.accessor.accessor.accessor);
} else {
  console.log(null);
}
如果你不关心编译时的错误检查,你可以做一些像这样奇怪的事情。我不推荐

function tryGetValue(obj, propertiesPath) {
  if (!obj) {
    return null;
  }

  if (!propertiesPath) {
    return obj;
  }

  let current = obj;
  let properties = propertiesPath.split(".");
  for (let i = 0; i < properties.length; i++) {
    if (current[properties[i]] !== undefined) {
      current = current[properties[i]];
    } else {
      current = null;
      break;
    }
  }

  if (current !== undefined) {
    return current;
  } else {
    return null;
  }
}

console.log(tryGetValue(object, "accessor.accessor.accessor"));
函数tryGetValue(对象、属性路径){
如果(!obj){
返回null;
}
如果(!propertiesPath){
返回obj;
}
让电流=obj;
让properties=propertiesPath.split(“.”);
for(设i=0;i
我喜欢在我的角度项目中使用

import * as R from 'ramda';

const leaf = R.path(['accessor', 'accessor', 'accessor'], object);
另一个我用来避免child为空时崩溃的方法(当ramda不在时)来自swifts
操作符的灵感,当child为空时默认为某个值

您不需要花哨的功能,这款单衬里可以实现防撞功能

const leaf = (((object || {}).accessor || {}).accessor || {}).accessor;
正在运行:
constErrorObject={accessor:null};
常量validObject={
访问者:{
访问者:{
访问者:“您的叶值”
}
}
};
//防撞,返回:未定义
常量错误叶=((错误对象|{}).accessor | |{}).accessor | |{}).accessor
console.log(错误页);
//甚至使用回退/默认值
constDefaultLeaf=((错误对象|{}).accessor | |{}.accessor | |{}.accessor | |{}.accessor | |}.accessor | |'default123';
console.log(defaultLeaf);
const validLeaf=((validObject | |{}).accessor | |{}).accessor | |{}).accessor

控制台日志(validLeaf)有一个由armanozak命名的npm包。非常简单和健壮的解决方案

你可以这样使用它

snq(() => object.accessor.accessor.accessor, anyDefaultValueIfYouLike);
如果你想知道它是如何工作的,这是我从中复制的源代码

导出默认函数snq(回调:()=>T,defaultValue?:T){
试一试{
const result=callback();
返回结果的类型===“未定义”?默认值:结果;
}捕捉(错误){
if(err instanceof TypeError){
返回默认值;
}
犯错误;
}
}

我想,您可以做类似这样的速记,这样可以让类型通过

const value = (() => {try{return object.accessor.accessor.accessor}catch(e){return yourDefault;}})();

你链接的中间帖子列出了这个问题几乎所有可能的解决方法。这篇文章中有什么不清楚的地方吗?或者你只是在寻找更好的解决方案?(目前还不存在)更好的解决方案。最近在angular 8中的变化使得这些建议都失败了。我获得的唯一成功是完全详细的
if(object.accessor!==null&&object.accessor!==undefined){console.log(object.accessor.accessor.accessor)}
当您必须对许多无法迭代的对象和键进行重复时,这就不太理想了@HereticMonkey的过度使用我正在寻找一个速记,但递归函数可能已经为我节省了一些行。我将返回对象,而不是真/假,但我需要立即返回值。这种速记够了吗<代码>(()=>{try{return object.accessor.accessor.accessor}catch(e){return default;}}}}()。。。可选链接不能很快出现:)当访问器不存在且组件的其余部分停止加载时,会引发未定义的异常。它可能显示编译时TypeScript错误,但是不应该有运行时错误。不,我说的是当对象不存在或不拥有该子对象时的运行时错误。如果访问器不存在,它将返回undefined,这是错误的,因此,它应该转到三元结构的错误方面。使用typescript,您可以/应该为对象/模型编写一个接口类,以在开发时检测可能的运行时错误。如果对象未定义,则在没有相同条件的情况下测试对象将导致崩溃。我不知道这是否是一个角度的东西,但是:
if(object.accessor)
=crash
if(object.accessor!==undefined&&object.accessor!==null)
=success。我不明白为什么是那样,但事实上是那样。真的是在关键时刻。还剩14分钟。
const value = (() => {try{return object.accessor.accessor.accessor}catch(e){return yourDefault;}})();