打字稿:交叉点 - 对命名感到困惑

问题描述 投票:0回答:2

我对 Typescript 中的名称 Intersection Types 有点困惑。

在集合论中,交集意味着只有两种类型共有的属性在两者的交集中才可用。

事实上,如果我在基元之间创建交集,这就是 Typescript 的行为方式。

type A = string | number
type B = number | boolean
type C = A & B

type D = string
type E = number
type F = D & B

在这种情况下,TS 将

C
推断为
number
,并将
F
推断为
never

enter image description hereenter image description here

但是,当涉及到对象时,创建交集会创建一个新的类型/接口,它结合了所用类型的属性 -

enter image description hereenter image description here

来自文档

TypeScript 提供了另一种称为交集类型的构造,主要用于组合现有的对象类型

从这个角度来看,对象的行为就非常有意义了。使用

&
也很有意义。

所以,我的问题是:

  1. 为什么对象和对象的行为看起来不同? 基元?
  2. 为什么选择交集这个名字?

也许它与 Union types 的解释有某种关系?

enter image description here

typescript type-theory set-theory
2个回答
10
投票

两个集合之间的交集将产生两个集合中的元素。

类型只是值集的描述。

那么对于基元

string & number
的交集,
string
集合和
number
集合中都有什么值,即。可以同时是
string
number
。答案是没有这样的价值。所以我们得到
never
(空集)

对于对象类型,结果有点不同。对象类型描述了值必须至少具有该类型所描述的属性的集合。因此集合

{ name: string, onlyA: string[] }
中的值可以具有属性
onlyB
,但它们不需要具有该属性 (ex)。

回到交点

ObA & ObB
,这个交点中的值必须同时满足
ObA
ObB
的描述。因此,该集合中的值将是
ObA
中也具有
onlyB
属性的值,以及来自
ObB
中也具有
onlyA
属性的值。基本上满足两个集合描述的值,对于对象类型,与基元不同,我们可以通过创建具有两种类型属性的对象来构造。

我的 tsconf 研讨会从您可能会感兴趣的“类型作为集合”部分开始。


0
投票

当一个值可以是多种类型之一时,使用联合类型(根据集合论,当我们联合 SetA 联合 SetB 时,并从联合集中取出一个项目,那么该项目的属性可以来自 SetA 或 SetB) .

对于交集类型,一个值必须同时满足多种类型(基于集合论,当我们将 SetA 和 SetB 相交时 - 并从交集中取出一个项目,那么该项目将满足集合 SetA 和 SetB 的属性

因此,在下面的示例中,交集类型“ManagementEmployee”要同时满足“Employee”类型和“Manager”类型的属性,它应该具有两者的属性(js上下文中的属性)

这就是我对此的结论。如果我错了请纠正我。

interface Employee {
  employeeID: number;
  age: number;
}
interface Manager {
  stockPlan: boolean;
}
type ManagementEmployee = Employee & Manager;
let newManager: ManagementEmployee = {
    employeeID: 12345,
    age: 34,
    stockPlan: true
};
© www.soinside.com 2019 - 2024. All rights reserved.