首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型文本的联合类型和交叉类型的命名

问类型文本的联合类型和交叉类型的命名
EN

Stack Overflow用户
提问于 2016-08-09 16:21:09
回答 8查看 6.5K关注 0票数 90

我无法理解TypeScript中的术语、联合类型和交叉类型背后的逻辑。

实际上,如果不同类型的属性是属性集,如果我将它们与&运算符组合在一起,则生成的类型将是这些集合的合并。按照这种逻辑,我希望这样的类型被称为联合类型。如果我将它们与|组合起来,我只能使用它们的公共属性,即集合的交集。

维基百科似乎支持这种逻辑:

任意给定非空集S的幂集(所有子集的集合)构成布尔代数和集合代数,具有两个运算:=∪(并)和∧:=∩(交)。

然而,根据typescriptlang.org的说法,情况正好相反:&用于生成交类型,|用于联合类型。

我肯定还有另外一种看待它的方法,但我想不出来。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-08-09 18:11:57

这是另一种思考的方法。考虑四组:蓝色的东西,红色的东西,大的东西和小的东西。

如果你把所有蓝色的东西和所有的小东西的集合交叉在一起,你就会得到属性的结合--集合中的所有东西都有蓝色属性和小属性。

但是如果你把蓝色的小东西和红色的小东西结合起来,那么在结果集中,只有小的属性是普遍的。“蓝小”与“红小”相交产生“小”。

换句话说,采用值域的合并会产生一组相交的属性,反之亦然。

以图像形式:

​

票数 54
EN

Stack Overflow用户

发布于 2016-08-09 16:33:13

类型A | B是指属于(、A或B )的对象。换句话说,这种类型的值是从用于的A值和B值的联合值中提取的。

类型A & B指的是、、A和B的对象。换句话说,这种类型的值是从A的值的值和B的值的值中提取的。

命名和语义在其他语言(如C++ )中是相同的。

票数 22
EN

Stack Overflow用户

发布于 2020-05-11 15:13:49

在这种情况下,不能将类型视为对象属性的集合。我们可以避免对查看标量变量和它们的允许值集(而不是对象)如何工作的联合和交叉类型的混淆:

代码语言:javascript
复制
type A = 1 | 2
type B = 2 | 3
type I = A & B
type U = A | B

let a: A
let b: B
let i: I
let u: U

a = 1
a = 2
a = 3 // <- error

b = 1 // <- error
b = 2
b = 3

i = 1 // <- error
i = 2
i = 3 // <- error

u = 1
u = 2
u = 3

这里的术语“并”和“相交”与集合论术语完全对应时,适用于允许值的集合。

将允许值(实例)的概念应用于对象类型有点棘手(因为集合论的类比不太适用):

代码语言:javascript
复制
type A = {
  x: number
  y: number
}

type B = {
  y: number
  z: number
}

type I = A & B
type U = A | B
  • 类型为A的变量可以保存具有属性x和y的对象实例(没有其他属性)。
  • 类型为B的变量可以保存具有属性y和z的对象实例(没有其他属性)。
  • 在集合论中,上述两组对象意图的交集是空的。但是,交集类型 I的变量可以保存具有A类型和B类型(即x、y和z;因此是&符号)属性的对象,该对象对应于这两种类型的属性的E 125I>并E 226(因此造成混淆)。
  • 在集合论中,上述两组对象的结合并不包括具有所有三个属性的对象。但是,intersection联合类型 U的变量可以保存具有A类型或B类型(逻辑OR,而不是XOR,即x和y、y和z,或x、y和D40的对象;因此出现|符号)的对象,这意味着在我们的示例中这两种类型(y >)的属性的是存在的(因此出现了混淆)。
代码语言:javascript
复制
let i: I
let u: U

i = { x: 1, y: 2 };         // <- error
i = { y: 2, z: 3 };         // <- error
i = { x: 1, y: 2, z: 3 };

u = { x: 1, y: 2 };
u = { y: 2, z: 3 };
u = { x: 1, y: 2, z: 3 };
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38855908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档