为什么 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"
),打字稿会警告您。
手册基础知识中的主题之一是 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"
),打字稿会警告您。