这段代码正在为我的同事编译,但不适合我

时间:2017-06-13 18:29:20

标签: javascript angular typescript

在我们的Typescript驱动的Angular 2应用程序中,一位同事和我正在遇到代码正在编译我们中的一个而不是另一个的情况。有问题的代码就是这个块:

        // Internal function used to insert schedule
        let __insert = function (scheduleTime)
        {
            // Confirm before adding schedule
            if (this.confirmCallback)
            {
                let isCanceled = false;

                this.confirmCallback({
                    schedule: scheduleTime,
                    cancel: function ()
                    {
                        isCanceled = true;
                    }
                });

                // Return if insert is canceled
                if (isCanceled == true)
                {
                    this.editingEvent = null; // Reset edit event
                    return;
                }
            }

对我来说产生错误的具体行是这样的:

if (isCanceled == true)

我收到与上述代码有关的以下错误:

  

ERROR in ... Operator' =='不适用于类型' false'和   '真'

我的同事没有得到这样的错误,并且认为这一定是IDE问题。我已经检查了,它不是Lint设置。即使我的IDE不喜欢它,它仍然应该编译,如果它是有效的JS。因此,我们正试图找出原因。

与此同时,我们正在使用一个解决方案,我们只需要检查"真实性",通过这样做:

if (isCanceled)

但是,正如我的同事指出的那样,这种检查并不健全。

问题是:为什么我在这里得到一个恭维错误?这是特定于打字稿的问题吗?别的什么?这段代码应该编译吗?

1 个答案:

答案 0 :(得分:1)

关注bug #12772我会说你和你的同事正在运行不同的Typescript编译器版本(可能是2.0和2.1 - 这就是上述票证的OP出现问题的时候)。

该错误的评论解释了为什么会发生这种情况(我调整了变量名称以适合您的代码段):

  

在控制流isCanceled之后,似乎没有为false以外的任何值分配。函数表达式不被视为流的一部分,因为它不能保证执行。结果是条件isCanceled的类型为false,并且检查被视为无效。

     

一种解决方法是将boolean转换为var isCanceled = false as boolean,将false变量的类型扩展为true | false。或者将检查更改为真实性if (isCanceled)

     

有关详细信息,请参阅#12729

所以似乎在TS编译器的2.1版本附近引入了类型推断/控制流设计限制。您可以在the ticket #9998中阅读有关TypeScript类型推断和控制流分析限制以及权衡的更多信息。