我无法理解TypeScript中术语联合类型和交集类型背后的逻辑.
从务实角度来说,如果不同类型的属性是套房产,如果我与他们结合&
操作,产生的类型将成为联盟的那些套.遵循这个逻辑,我希望像这样的类型被称为联合类型.如果我将它们组合在一起|
,我只能使用它们的共同属性,即集合的交集.
维基百科似乎支持这种逻辑:
任何给定非空集S的幂集(所有子集的集合)形成布尔代数,集合的代数,具有两个运算∨:=∪(并集)和∧:=∩(交集).
但是,根据typescriptlang.org,它恰恰相反:&
用于生成交集类型并|
用于联合类型.
我确信还有另一种方式来看待它,但我无法弄明白.
根据交集的定义,几种类型的交集应该产生一个类型,该类型的属性对于所有类型来说都是公共的。例如,如果我们有:
type o1 = {a: string, b: string}
type o2 = {a: string, c: string}
type o3 = o1 & o2
Run Code Online (Sandbox Code Playgroud)
theno3
应该是一个仅具有属性的类型,a
因为是和a
的公共属性。然而,我们实际上得到的是一个具有属性、和 的类型。在这种情况下,交集类型的行为似乎并不像其名称所显示的那样。它的作用更像是所有类型的组合。那么交叉口类型真的与交叉口有关吗?如果不是,为什么我们称其为交集类型而不是组合类型或其他名称?o1
o2
a
b
c
我在试图绕过这样一个事实时遇到了一些麻烦,即类型never
毫无意义并且可以在它位于union type内时被丢弃。
我的意思是,我在一个交集类型中得到它,never
将立即使所有结果都变成never
,因为没有任何类型可以通过某种类型和never
相同的类型。对于我,这说得通。
但是在联合类型中,我的直觉最初告诉我该never
类型将是一个有效的选项。我的问题是为什么不是?为什么never
可以在联合类型中丢弃?
有人可以对此做出合理的解释,以便我更好地理解它吗?