【发布时间】:2018-06-28 01:51:58
【问题描述】:
我已经写了一个方法来模仿Null条件运算符/猫王运算符,包括自动完成和数组支持:
假设我有这个对象:
var o = { a: { b: { c:[{a:1},{a:2}] , s:"hi"} } };
我可以访问数组中的第二个元素并获取a:
if ( n(o, (k) => k.a.b.c[1].a) == 2 )
{
alert('Good'); //true
}
我所做的是将表达式作为函数发送,然后我可以将其解析为字符串:
function n<T>(o :T , action : (a:T)=>any):any {
let s = action.toString().toString().split('return')[1].split('}')[0].split(';')[0];
s = s.replace(/\[(\w+)\]/g, '.$1'); //for array access
s = s.replace(/^\./, ''); //remove first dot
var a = s.split('.');
for (var i = 1, n = a.length; i < n; ++i) { //i==0 is the k itself ,aand we dont need it
var k = a[i];
if ( o && o.hasOwnProperty(k)) {
o = o[k];
} else {
return null;
}
}
return o;
}
It does work 符合预期,但我有一个小问题。
方法的签名返回any:
function n<T>(o :T , action : (a:T)=>any) :any
^^^
问题:
是否有任何选项可以使返回值更具体(甚至更准确)作为我尝试访问的道具?
所以n(o, (k) => k.a.b.c[1].a) 将是:number
而n(o, (k) => k.a.b.s) 将是:string
有可能吗?如果没有,有没有办法让返回值更“典型”?
【问题讨论】:
标签: javascript typescript