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

Aqu*_*irl 6 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
}
Run Code Online (Sandbox Code Playgroud)

在教程中找到了这段代码。我想了解这个错误的含义:"types '"a"' and '"b"' have no overlap."

他们在说什么?

Joa*_*uer 8

在 TypeScript 中"a"文字类型。它是一种只有一个值的类型,即"a"。等价于"b".

由于初始化的方式,valueTypeScript 认为 的类型value"a" | "b"联合类型,基本上意味着值必须是类型"a"或类型"b"

如果 的类型(以及值)value不是 "a"则将执行第一个 if 的块。

这意味着 will 的条件else if肯定会作用于类型(和值)的值"a"。现在您正在将 type 的值"a"与 type 的值进行比较"b"

但是 TypeScript 中的值不能同时属于类型"a"和类型,因为类型没有重叠(这只是说没有值可以同时属于两种类型的另一种方式)。"b"

换句话说:TypeScript 发现value不可能"b"在那个点,因此之后的第二个块else if将永远不会被执行。

作为重叠类型的反例,请考虑string"a"。该值"a"显然是类型string。它也是类型"a"(根据定义)。这意味着类型string"a" 有一些重叠