我和一位同事遇到了这样一种情况:在我们的打字稿驱动的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)


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


  ...运算符'=='中的错误无法应用于类型'false'和
  '真正'。


我的同事没有出现此类错误,并认为这一定是IDE问题。我已经检查过了,这不是皮棉设置。即使我的IDE不喜欢它,如果它是有效的JS,它仍应该编译。因此,我们正在尝试找出原因。

同时,我们正在使用一种解决方案,通过执行以下操作来检查“真实性”:

if (isCanceled)


但是,正如我的同事指出的那样,这张支票没有那么坚固。

问题是:为什么我在这里却没有得到补充错误?这是特定于打字稿的问题吗?还有吗该代码应该编译吗?

最佳答案

查看bug #12772,我想说您和您的同事正在运行不同的Typescript编译器版本(可能是2.0和2.1-这是在提到的票证的OP出现问题时)。

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


  遵循控制流程isCanceled似乎未分配false以外的任何值。函数表达式不被视为流程的一部分,因为不能保证执行它。结果为条件isCanceled具有类型false且检查被视为无效。
  
  一种解决方法是将其转换为布尔值var isCanceled = false as boolean,从而将变量形式的类型从false扩展为true | false。或将支票更改为真实性if (isCanceled)
  
  有关更多详细信息,请参见#12729


因此,似乎在2.1版本的TS编译器附近引入了类型推断/控制流设计限制。您可以在the ticket #9998中详细了解TypeScript的类型推断以及控制流分析的限制和权衡。

09-06 05:21
查看更多