gpt4 book ai didi

javascript - 在 Typescript 中返回动态编译时类型?

转载 作者:行者123 更新时间:2023-11-30 11:17:18 27 4
gpt4 key购买 nike

我写了一个方法来模仿 Null 条件运算符/Elvis 运算符,包括自动完成 数组支持:

假设我有这个对象:

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 
^^^

问题:

是否有任何选项可以使返回值更具体(甚至更准确)作为我尝试访问的 Prop ?

所以 n(o, (k) => k.a.b.c[1].a) 将是 :numbern(o, (k) => k.a.b.s) 将是 :string

这可能吗?如果不是,有没有办法让返回值更“typi”?


Link for comment

最佳答案

您可以只为返回值添加一个额外的类型参数,让编译器判断该类型参数是表达式的返回类型:

var o = { a: { b: { c: [{ a: 1 }, { a: 2 }], s: "hi" } } };
function n<T, TValue>(o: T, action: (a: T) => TValue): TValue | null {
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('.');
let result: any = o
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 ( result && result.hasOwnProperty(k)) {
result = result[k];
} else {
return null;
}
}
return result;
}


let nr = n(o, (k) => k.a.b.c[1].a) // is number | null

var str = n(o, (k) => k.a.b.s) // is string | null

注意 |null 部分是可选的,但在您的实现上下文中有意义。

关于javascript - 在 Typescript 中返回动态编译时类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51068319/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com