首页 > 解决方案 > 打字稿编译器错误地假设错误值

问题描述

我遇到了一个问题,打字稿编译器假设一个变量总是错误的,因为它是这样声明的。

代码相当简单,要引入错误我必须使用外部库来修改声明的变量。在这种情况下,我使用的是 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 问题:

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 版

标签: typescript

解决方案


将您的代码更改为:

let result = false as boolean;

typescript之所以抱怨是因为它认为它比它更聪明,即它看到你falseresult变量赋值,但它没有看到回调函数中的操作。

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

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


推荐阅读