Angular 8本机Typescript无崩溃,存取器速记
角度8: 我曾经在打字脚本方面使用过一个简短的技巧:Angular 8本机Typescript无崩溃,存取器速记,angular,typescript,ecmascript-2017,Angular,Typescript,Ecmascript 2017,角度8: 我曾经在打字脚本方面使用过一个简短的技巧: object['accessor']['accessor']['accessor'] 得到 object.accessor.accessor.accessor 如果其中一个孩子是空的,就不会有抛出错误的风险 根据今天的ECMA脚本标准,在typescript文件中实现这一点的最佳方法是什么 编辑: 我找到了这个 b/嵌套的三元表达式似乎是最好的,但似乎很复杂 编辑2: 无论如何,这同样会导致应用程序崩溃(尽管是在组件级别) 新的安格尔规则似乎
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)
=crashif(object.accessor!==undefined&&object.accessor!==null)
=success。我不明白为什么是那样,但事实上是那样。真的是在关键时刻。还剩14分钟。
const value = (() => {try{return object.accessor.accessor.accessor}catch(e){return yourDefault;}})();