【问题标题】:TypeScript handbook issue?TypeScript 手册问题?
【发布时间】:2018-02-06 00:00:01
【问题描述】:

我正在阅读 TypeScript 手册的 Advanced Type section 在我看来,交集类型和联合类型的描述是互换的:

交叉口类型

交集类型将多种类型组合成一个[...]

这是我期望的联合类型:

联合类型

如果我们有一个联合类型的值,我们只能访问联合中所有类型共有的成员。

所有成员的共同点听起来像是一个十字路口。

这看起来正确吗?

【问题讨论】:

  • 我也经常混淆它们,命名不太理想,但这不是手册问题,这是它们的官方打字稿命名。
  • 不,它是正确的,你只是想不同。这取决于集合的元素是什么。他们是类型吗?它们是类型的属性吗?

标签: typescript


【解决方案1】:

在结构类型系统中,类型可以定义为符合该类型的所有值的集合。例如,如果您有

type A = {a: string}

那么符合A 的值集合是所有具有名为a 的属性且该属性类型为string 的对象的集合。

如果你有

type B = {b: number}

然后

type AB = A & B

您刚刚描述的AB 是所有具有ab 属性且类型正确的所有对象的集合,换句话说,集合AB 的交集。所以碰巧对象类型的交集类型必须具有两种类型的所有属性,并且其属性集是一个联合 - 这就是混淆的来源。

如果您将类型定义为属性的集合,则确实会切换并集和交集的定义,但是这种定义更受限制 - 它不允许为所有类型定义交集和并集。有些类型不是对象(例如,undefined),还有一些类型具有不能描述为对象属性的属性 - 例如,函数类型的对象是可调用的。

【讨论】:

  • 感谢 artem 的澄清!竖起大拇指!
【解决方案2】:

术语不是 TypeScript 特定的。仍然令人困惑!

这两种类型是互补的:

“交集类型[是]联合类型的逻辑补充。联合类型A | B表示具有AB类型的实体,而交集类型A & B表示具有输入 A 和输入 B.", Anders Hejlsberg's pull request.

确实,考虑以​​下类型:

interface A {}
interface B extends A { }
interface C extends A { }
interface D extends B, C { }

他们可以这样看:

  • A == B | C | D
  • D == B & C

但它们的常见用法不同。

联合类型

“联合类型定义将指定允许的原始类型中的哪一个可以存储在其实例中”,Wikipedia

常见用例:

  • “可空”:T | null,与 strictNullChecks compiler option 结合使用。
  • 原始值列表:'A' | 'B' | 'C'(而不是 string
    • Redux 操作名称
    • keyof T 的输出
    • ...

交叉口类型

不要与mathematical set intersection混淆。

“[在结构子类型中],两种类型的结构决定了一种是否是另一种的子类型”,Wikipedia

交集类型在日常代码中并不常见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2018-01-28
    • 2015-12-29
    • 2019-01-31
    • 2020-04-29
    • 2019-08-15
    • 2020-11-25
    • 2021-06-18
    相关资源
    最近更新 更多