sev*_*sik 35 boolean-logic set typescript
我无法理解TypeScript中术语联合类型和交集类型背后的逻辑.
从务实角度来说,如果不同类型的属性是套房产,如果我与他们结合&
操作,产生的类型将成为联盟的那些套.遵循这个逻辑,我希望像这样的类型被称为联合类型.如果我将它们组合在一起|
,我只能使用它们的共同属性,即集合的交集.
维基百科似乎支持这种逻辑:
任何给定非空集S的幂集(所有子集的集合)形成布尔代数,集合的代数,具有两个运算∨:=∪(并集)和∧:=∩(交集).
但是,根据typescriptlang.org,它恰恰相反:&
用于生成交集类型并|
用于联合类型.
我确信还有另一种方式来看待它,但我无法弄明白.
Rya*_*ugh 17
这是考虑它的另一种方式.考虑四组:红色东西,蓝色东西,大事物和小东西.
如果你将所有红色事物和所有小事物的集合相交,你最终会得到属性的联合 - 集合中的所有东西都包含red属性和小属性.
但是,如果你拿了工会的红色小东西和蓝色的小东西,只有渺小属性在结果集普遍.将 "红色小"与"蓝色小" 相交会产生"小".
换句话说,取值域的并集会产生一组相交的属性,反之亦然.
小智 9
类型A | B
是指或者是 A
或者的对象B
.换言之,这样的类型的值是从所绘制的联合对值的A
值和B
.
类型A & B
是指是对象都 A
和B
.换句话说,这种类型的值是从值和值的交集中绘制的.A
B
命名和语义在其他语言(如C++)中是相同的.
这里的混淆可能源于我们如何想象集合,即认为交集/联合涉及类型的成员而不是类型本身。我整理了一个图形,希望能澄清这个概念:
在这种情况下,您不能将类型视为一组对象属性。我们可以通过查看标量变量及其允许值集(而不是对象)来避免对联合和交集类型如何工作的混淆:
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
Run Code Online (Sandbox Code Playgroud)
这里的术语“联合”和“交集”在应用于允许值的集合时与集合论术语完全对应。
将允许值(实例)的概念应用于对象类型有点棘手(因为集合论类比并不适用):
type A = {
x: number
y: number
}
type B = {
y: number
z: number
}
type I = A & B
type U = A | B
Run Code Online (Sandbox Code Playgroud)
A
可以保存具有属性x
和y
(没有其他属性)的对象实例。B
可以保存具有属性y
和z
(没有其他属性)的对象实例。I
能够保持与类型的属性的对象A
和那些类型的B
(即x
,y
和z
;因此,&
符号),其对应于联合两种类型的属性(因此混乱)。U
可以保存具有类型A
OR属性的对象B
(逻辑 OR,而不是 XOR,即x
and y
, y
and z
, or x
, y
, and z
; 因此是|
符号),这意味着两个属性的交集类型(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 };
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1430 次 |
最近记录: |