[英]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.