打字稿说:“类型 '"a"' 和 '"b"' 没有重叠”。这是什么意思?

时间:2021-04-21 12:36:32

标签: javascript typescript

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

他们在说什么?

2 个答案:

答案 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 ifstring。值 "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'

相关问题