簡體   English   中英

打字稿功能怪異的空隙|| &&行為

[英]Typescript Function Weird Void || && Behaviour

為什么returnObject導致編譯TypeError returnObject2不是?

通常, void || something void || something應該返回somethingvoid && something應該返回void

但是在Typescript中,情況恰恰相反。

var returnVoid = function(){};

var returnObject = function(){  //Typescript compilation TypeError. 
    //No best common type exists among return expressions.
    if(Math.random() < 0.5)
        return new Error();
    return returnVoid() || null; //always return null
}
var returnObject2 = function(){ //works
    if(Math.random() < 0.5)
        return new Error();
    return returnVoid() && null; //always return undefined
}

注意:TypeError發生在編譯期間,而不是在運行時。


編輯:我做了另一個測試。 不宜returnNum2() => number過多考慮(undefined || something) === something 注意: void 0行為相同。

var returnNum = function(){ //() => number
    return undefined || 0; 
}

var returnVoid = function(){};

var returnNum2 = function(){ //() => void | number
    return returnVoid() || 0; 
}

注釋中已經指出了這一點,但是我認為通常您只需要了解function(){}將返回undefined ,該行為為邏輯運算符指定了行為。

對於undefined && somevalue ,將始終返回undefined。 對於undefined || somevalue undefined || somevalue ,somevalue將被評估並返回。

這是獲得更多信息的很好的參考: http : //www.javascriptkit.com/jsref/comparison_operators.shtml

編輯:問題不是關於邏輯操作返回什么,而是為什么打字稿給出error TS2354: No best common type exists among return expressions. 在編譯。

這似乎確實是一個錯誤,但在上下文中可能是有道理的。 如果僅使用對returnVoid()的調用來替換邏輯運算符,則在兩個函數中都會得到相同的錯誤。 靜態類型允許&&運算符完全短路以進行類型輸入,因為something && null永遠不會求值為類型,而something || null something || null取決於什么是something

與此相關,在typescript中,您不能顯式指定null或undefined作為函數的返回類型。

雖然我知道為什么會這樣,但我同意這有點奇怪。 與制作Typescript並提交錯誤的人員進行檢查可能值得一試。

TypeScript不使用undefined || T形式的特殊情況表達式 undefined || Tvoid || T void || T變為T是因為a)您不應該編寫該代碼(使用逗號運算符!),並且b)編寫此代碼並不安全,因為返回值的矛盾意味着您不能僅僅因為擁有無效返回函數參考。

考慮是否編寫了這樣的代碼:

type callback = (arg: any) => void;

function doSomething(x: callback) {
    return x(10) || 'Hello, world!';
}

var x = [];
var add = (arg: any) => x.push(arg);
console.log(doSomething(add)); // Prints '1', not 'Hello, world!'

暫無
暫無

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

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