打字稿 说:"types '" "' and '" b "' have no overlap" .什么意思?


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".

由于您初始化valueTypeScript 认为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'.

相关内容

最新更新