const value = Math.random() < 0.5 ? "a" : "b";
if (value !== "a") {
// ...
} else if (value === "b") {
This condition will always return 'false' since the types '"a"' and '"b"' have no overlap.
// Oops, unreachable
}
在教程中找到此代码。我想了解这个错误的含义:"types '"a"' and '"b"' have no overlap."
他们在说什么?
答案 0 :(得分:3)
在 TypeScript 中,"a"
是 a literal type。它是一种只有一个值的类型,即 "a"
。等效于 "b"
。
由于您初始化 value
的方式,TypeScript 认为 value
的类型为 "a" | "b"
(union type 基本上意味着该值必须是 {{ 1}} 或 "a"
类型。
如果 "b"
的类型(因此也是值)not value
,那么第一个 if 的块将被执行。
这意味着 "a"
的条件肯定会对类型(和值)else if
的值进行操作。现在,您正在将 "a"
类型的值与 "a"
类型的值进行比较。
但是 TypeScript 中的值不能同时属于 "b"
类型和 "a"
类型,因为类型没有重叠(这只是另一种方式说值不能同时属于两种类型)。
换句话说:TypeScript 在那个时候发现 "b"
不能是 value
,因此 "b"
之后的第二个块永远不会被执行。
作为具有重叠类型的反例,请考虑 else if
和 string
。值 "a"
显然是 "a"
类型。它也是 string
类型的(根据定义)。这意味着类型 "a"
和 string
有一些重叠。
答案 1 :(得分:1)
在您的示例中,value
只能是字符串 'a'
或 'b'
,因此:
if (value !== 'a') {
// here value can ONLY be 'b'
} else {
// here value can ONLY be 'a'
}
因此,在这种情况下,条件 else if (value === 'b')
无法达到,TypeScript 会阻止您并指定 'a' !== 'b'
。