[英]Typescript Function Weird Void || && Behaviour
為什么returnObject
導致編譯TypeError returnObject2
不是?
通常, void || something
void || something
應該返回something
而void && 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 || T
或void || 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.