我无法理解TypeScript中的术语、联合类型和交叉类型背后的逻辑。
实际上,如果不同类型的属性是属性集,如果我将它们与&运算符组合在一起,则生成的类型将是这些集合的合并。按照这种逻辑,我希望这样的类型被称为联合类型。如果我将它们与|组合起来,我只能使用它们的公共属性,即集合的交集。
维基百科似乎支持这种逻辑:
任意给定非空集S的幂集(所有子集的集合)构成布尔代数和集合代数,具有两个运算:=∪(并)和∧:=∩(交)。
然而,根据typescriptlang.org的说法,情况正好相反:&用于生成交类型,|用于联合类型。
我肯定还有另外一种看待它的方法,但我想不出来。
发布于 2016-08-09 18:11:57
这是另一种思考的方法。考虑四组:蓝色的东西,红色的东西,大的东西和小的东西。
如果你把所有蓝色的东西和所有的小东西的集合交叉在一起,你就会得到属性的结合--集合中的所有东西都有蓝色属性和小属性。
但是如果你把蓝色的小东西和红色的小东西结合起来,那么在结果集中,只有小的属性是普遍的。“蓝小”与“红小”相交产生“小”。
换句话说,采用值域的合并会产生一组相交的属性,反之亦然。
以图像形式:

发布于 2016-08-09 16:33:13
类型A | B是指属于(、A或B )的对象。换句话说,这种类型的值是从用于的A值和B值的联合值中提取的。
类型A & B指的是、、A和B的对象。换句话说,这种类型的值是从A的值的值和B的值的值中提取的。
命名和语义在其他语言(如C++ )中是相同的。
发布于 2020-05-11 15:13:49
在这种情况下,不能将类型视为对象属性的集合。我们可以避免对查看标量变量和它们的允许值集(而不是对象)如何工作的联合和交叉类型的混淆:
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这里的术语“并”和“相交”与集合论术语完全对应时,适用于允许值的集合。
将允许值(实例)的概念应用于对象类型有点棘手(因为集合论的类比不太适用):
type A = {
x: number
y: number
}
type B = {
y: number
z: number
}
type I = A & B
type U = A | BA的变量可以保存具有属性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 >)的属性的是存在的(因此出现了混淆)。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 };https://stackoverflow.com/questions/38855908
复制相似问题