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."
他们在说什么?
在 TypeScript 中,"a"
是一个文字类型。它是一种只有一个值的类型,即"a"
.相当于"b"
.
由于您初始化value
TypeScript 认为value
的类型是"a" | "b"
的(一种联合类型,基本上意味着值必须是"a"
类型或"b"
类型。
如果value
的类型(以及值)不是"a"
那么第一个if的块将被执行。
这意味着else if
的条件肯定会在类型(和值)的值上运行"a"
。现在,您正在比较类型为"a"
的值与类型为"b"
的值。
但是 TypeScript 中的值不能同时属于"a"
和"b"
类型,因为这些类型没有重叠(这只是另一种说法,即没有值可以同时属于两种类型)。
换句话说:TypeScript 发现value
在这一点上无法"b"
,因此else if
之后的第二个块将永远不会被执行。
作为重叠类型的反例,请考虑string
和"a"
。"a"
的值显然属于string
类型。它也属于"a"
类型(根据定义)。这意味着string
和"a"
的类型有一些重叠。
在您的示例中,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'
.