我正在阅读TypeScript手册的Advanced Type section 在我看来,交集类型和联合类型的描述是互换的:
交叉点类型
交集类型将多种类型合并为一个[...]
这就是我期望的联合类型:
联盟类型
如果我们有一个具有联合类型的值,我们只能访问联合中所有类型共有的成员。
所有成员共同听起来像一个交集。
这看起来是否正确?
答案 0 :(得分:0)
在结构类型系统中,type可以定义为符合该类型的所有值的集合。例如,如果你有
type A = {a: string}
然后符合A
的值集是一组具有名为a
的属性且属性类型为string
的所有对象。
如果你有
type B = {b: number}
然后
type AB = A & B
您刚才描述的AB
是一组具有正确类型的属性a
和b
的所有对象,换句话说,就是集合A
和B
。所以碰巧交叉类型的对象类型必须具有来自两种类型的所有属性,并且它的属性集是一个联合 - 这就是混乱的来源。
如果将类型定义为属性集合,那么确实会切换union和intersection的定义,但这种定义更有限 - 它不允许为所有类型定义交集和并集。有些类型不是对象(例如,undefined
),有些类型的属性也不能被描述为对象的属性 - 例如,函数类型的对象是可调用的。
答案 1 :(得分:0)
术语不是特定于TypeScript的。仍然令人困惑!
这两种类型是互补的:
“交集类型[是]联合类型的逻辑补充。联合类型
A | B
表示类型为A
或类型为B
的实体,而交集类型为{{ 1}}表示同时具有A & B
类型和A
类型的实体。“, Anders Hejlsberg's pull request 。
确实,考虑以下类型:
B
他们可以这样看:
interface A {}
interface B extends A { }
interface C extends A { }
interface D extends B, C { }
A == B | C | D
但他们没有相同的共同用法。
“联合类型定义将指定可以在其实例中存储多个允许的基元类型”, Wikipedia 。
常见用例:
D == B & C
,加上T | null
compiler option。strictNullChecks
(而不是'A' | 'B' | 'C'
)
string
不要与mathematical set intersection混淆。
“[在结构子类型中],两种类型的结构决定一个是否是另一个”, Wikipedia 的子类型。
交叉点类型在日常代码中并不常见:
keyof T
interface A extends B, C {}
$.extend()
,Object.assign()
。见TypeScript Deep Dive > Type System > Intersection Type。