我和一位同事遇到了这样一种情况:在我们的打字稿驱动的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的类型推断以及控制流分析的限制和权衡。