【问题标题】:Typescript compiler incorrectly assuming false value打字稿编译器错误地假设错误值
【发布时间】:2018-11-30 15:03:57
【问题描述】:

我遇到了一个问题,即 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.
}

Playground Link

已经提出了一些 github 问题:

https://github.com/Microsoft/TypeScript/issues/27910

https://github.com/Microsoft/TypeScript/issues/27401

https://github.com/Microsoft/TypeScript/issues/9998

这些似乎都比上面简单的可重现要复杂一些。这是 TypeScript 的预期行为吗?看来这里的功亏一篑。我很确定这在版本 2 中没有发生。

有解决办法吗?我做错了吗?

目前我使用的是 TypeScript 3.2.1 版

【问题讨论】:

  • 解决方法:使用let result = _.some(p, s => s === 'Two'); :)
  • 你可以使用for... of
  • @HereticMonkey 是的,那肯定会更干净。而且更优雅。但是,我更多地使用该示例进行演示,而不是实际使用。

标签: typescript


【解决方案1】:

将您的代码更改为:

let result = false as boolean;

typescript 抱怨的原因是它认为它比实际更聪明,即它看到你将 false 值分配给了 result 变量,但它没有看到回调函数中的操作。

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

可能TS认为操作_.each是因为回调是异步的,但当然不是每一个涉及回调的操作都是异步的。

【讨论】:

  • 感谢 Nurbol。这解决了这个问题。尽管我仍然不相信这个问题需要解决。
  • 至于推理,这里有介绍:github.com/Microsoft/TypeScript/issues/9998
  • @NeilWatson 哦,TS 中有很多东西并不完美(就像生活中一样)。但总体来说还不错。
  • @Aaron 你能指出问题的确切位置吗?我很好奇。
猜你喜欢
  • 2017-06-26
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2018-07-03
  • 2013-02-21
  • 2016-04-06
  • 2016-06-19
  • 2016-08-21
相关资源
最近更新 更多