打字稿函数奇怪的空洞|| &安培;&安培;行为

时间:2016-01-06 18:41:07

标签: javascript typescript

为什么returnObject导致编译TypeError returnObject2 isn&#t; t?

通常情况下,void || something应返回somethingvoid && something应返回void

但在打字稿中,情况正好相反。

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; 
}

2 个答案:

答案 0 :(得分:3)

在评论中已经指出了,但我认为通常你只需要理解function(){}将返回undefined,它已经为逻辑运算符指定了行为。

对于undefined && somevalue,将始终返回undefined。对于undefined || somevalue,将评估并返回某些值。

以下是更多信息的参考资料:http://www.javascriptkit.com/jsref/comparison_operators.shtml

编辑:问题不是关于逻辑操作返回什么,而是为什么typescript在编译时给出error TS2354: No best common type exists among return expressions.

这似乎是一个错误,但在上下文中可能有意义。如果仅使用returnVoid()调用替换逻辑运算符,则两个函数都会出现相同的错误。静态类型允许&&运算符完全短路以进行输入,因为something && null永远不会评估为某种类型,但something || null可能取决于something的内容。

与此相关,在typescript中,您无法显式指定null或undefined作为函数的返回类型。

虽然我理解为什么会出现这种情况,但我同意这有点奇怪。可能值得与制作Typescript并提交错误的人一起检查。

答案 1 :(得分:2)

TypeScript不会将undefined || Tvoid || 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!'