typescript - 打字稿编译器错误地假设错误值
问题描述
我遇到了一个问题,打字稿编译器假设一个变量总是错误的,因为它是这样声明的。
代码相当简单,要引入错误我必须使用外部库来修改声明的变量。在这种情况下,我使用的是 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 版
解决方案
将您的代码更改为:
let result = false as boolean;
typescript之所以抱怨是因为它认为它比它更聪明,即它看到你false
为result
变量赋值,但它没有看到回调函数中的操作。
我真的不知道为什么 Typescript 团队会这样做。他们肯定有他们的理由,但他们也错过了你的例子。
可能 TS 认为操作_.each
是异步的,因为回调,但当然不是每个涉及回调的操作都是异步的。
推荐阅读
- svg.js - 无法为 SVG.JS 中的函数创建的多边形设置动画
- python - urllib.request 在开头添加字符
- javascript - 登录失败时收到登录警报
- python - 如果为该邮件帐户启用了 MFA,如何通过 python 脚本发送邮件?
- php - 无法使用 openssl_private_decrypt 解密任何消息
- c# - C# 和深拷贝中的 Elm 架构 (MVU)
- html - 画外音无法从选择下拉列表中发音非英语选项
- sql-server - 如何通过加入另一个表从数据中更新在xml中具有多个相同元素的表中的xml
- cordova - 安装`ionic cordova plugin add cordova-plugin-fcm-with-dependecy-updated`后无法构建我的Ionic项目
- python - 相同的命令但不同的结果,cmd和python子进程之间的奇怪行为