簡體   English   中英

在Typescript中返回動態編譯時間類型?

[英]Return dynamic compile time type in Typescript?

我編寫了一個模擬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;
}

它確實按預期工作 ,但我有一個小問題。

該方法的簽名返回any

function n<T>(o :T , action : (a:T)=>any) :any 
                                           ^^^ 

題:

是否有任何選項可以使返回值更具體(甚至精確)作為我試圖訪問的道具?

所以n(o, (k) => kabc[1].a)將是:numbern(o, (k) => kabs)將是:string

可能嗎 ? 如果沒有,有沒有辦法讓返回值更“典型”?


鏈接評論

您只需為返回值添加一個額外的類型參數,並讓編譯器確定type參數是表達式的返回類型:

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部分是可選的,但在實現的上下文中是有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM