使用三元运算符时的编译器错误

MIN*_*uma 4 typescript

我在Visual Studio 2012中使用typescript 0.9.0.1.在我的代码中使用三元运算符时,编译器会抛出错误:无法确定条件表达式的类型.在void和之间找不到最常见的类型boolean.

代码是:

export class event
{
    public static add (elem: HTMLElement, ev: string, fn: (ev: Event) => void, thisObj?)
    {
        var callFn = function (ev: Event) { fn.call(thisObj || elem, ev); };

        elem.addEventListener ? elem.addEventListener(ev, callFn, false) : elem.attachEvent('on' + ev, callFn);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用if-else而不是三元运算符.然后错误不会发生.

代码是:

export class event
{
    public static add (elem: HTMLElement, ev: string, fn: (ev: Event) => void, thisObj?)
    {
        var callFn = function (ev: Event) { fn.call(thisObj || elem, ev); };

        if (elem.addEventListener)
        {
            elem.addEventListener(ev, callFn, false);
        }
        else
        {
            elem.attachEvent('on' + ev, callFn);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码有问题吗?

tho*_*aux 10

这个错误就是一切.这意味着其中一个案例结果void会导致另一个案例结果boolean.由于这两种类型没有通用类型,因此不能在三元运算符中使用它们.虽然在您的特定情况下,可以允许它,因为您没有将结果分配给变量.

如果您将其分配给变量,则错误更有意义:

var someVar = condition ? aMethodWhichReturnsBoolean : aMethodWhichReturnsVoid;
Run Code Online (Sandbox Code Playgroud)

应该明确的是,编译器无法知道哪种类型someVar会,此外,它无法找到另一种类型将同时满足booleanvoid.因此它会抛出一个错误.

在你的情况下,再次将三元运算符扩展为if/else语句将解决错误,但是(完成)在我给出的示例中,您需要指定someVaras 的类型any.