为什么 else if 子句会导致 "this condition will always return 'true'" 错误?

Why an else if clause results in a "this condition will always return 'true'" error?

手册基础知识中的主题之一是 TypeScript 捕获逻辑错误。我将 if...else 语句的 else if 子句从 example in the handbook 更改为以下内容:

const value = Math.random() < 0.5 ? "a" : "b";
if (value !== "a") {

} else if (value !== "b") {
    
}

但是出现错误:

"This condition will always return 'true' since the types '"a"' and '"b"' have no overlap."

我错过了什么?此外,它在 JavaScript 中有效,那么为什么它在 TypeScript 中无效?

这是控制流分析和类型缩小的一部分。

Typescript 最初会将 value 键入为 "a" | "b"value !== "a" 检查意味着在真正的分支上 value 将是 "b" 因此它将键入值仅 "b",在错误分支上它将被键入为 "a",因为其他任何东西都会进入真正的分支。

这意味着您正在检查永远为真的东西(value !== b,永远为真,因为 value"a"),打字稿会警告您。