繁体   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