Typescript编译器错误地假定为假值

Typescript编译器错误地假定为假值,typescript,Typescript,我遇到了一个问题,typescript编译器假设变量始终为false,因为它是如何声明的 代码相当简单,为了引入错误,我必须使用外部库来修改声明的变量。在这种情况下,我使用的是lodash import * as _ from 'lodash'; // as an example let p = ["One", "Two"]; let result = false; _.each(p, s => { if (s === "Two") { result = tru

我遇到了一个问题,typescript编译器假设变量始终为false,因为它是如何声明的

代码相当简单,为了引入错误,我必须使用外部库来修改声明的变量。在这种情况下,我使用的是lodash

import * as _ from 'lodash'; // as an example

let p = ["One", "Two"];
let result = false;

_.each(p, s => {
    if (s === "Two") {
        result = true;
        return;
    }
});

if (result === true) { // Compiler error - this condition will always return false
    // do something.
}

出现了一些github问题:

这些看起来都比上面简单的复制品要复杂一些。这是TypeScript的预期行为吗?看来这里还不够。我很确定这不会发生在版本2中

附近有工作吗?我做错什么了吗


目前我正在使用TypeScript 3.2.1版

将您的代码更改为:

let result = false as boolean;
typescript抱怨的原因是它认为自己比实际情况更聪明,即它看到您将
false
值赋给
结果
变量,但它没有看到回调函数中的操作

我真的不知道Typescript团队为什么这样做。他们肯定有他们的理由,但他们也错过了你的例子


可能TS认为操作
由于回调,每个都是异步的,但当然不是所有涉及回调的操作都是异步的。

解决方法:使用
让结果=uuuu.some(p,s=>s=='Two'):)您可以使用
来。。。当然,那肯定会更干净。而且更优雅。然而,我使用这个例子更多的是为了演示,而不是实际生活中的使用。谢谢Nurbol。这就解决了问题。尽管我仍然不相信这个问题需要解决。至于原因,这里已经讲了:@NeilWatson哦,在TS中有太多不完美的东西(就像在生活中一样)。但总的来说还是不错的。@Aaron你能指出问题的确切位置吗?我很好奇。