我无法理解TypeScript中术语联合类型和交集类型背后的逻辑.
从务实角度来说,如果不同类型的属性是套房产,如果我与他们结合&
操作,产生的类型将成为联盟的那些套.遵循这个逻辑,我希望像这样的类型被称为联合类型.如果我将它们组合在一起|
,我只能使用它们的共同属性,即集合的交集.
维基百科似乎支持这种逻辑:
任何给定非空集S的幂集(所有子集的集合)形成布尔代数,集合的代数,具有两个运算∨:=∪(并集)和∧:=∩(交集).
但是,根据typescriptlang.org,它恰恰相反:&
用于生成交集类型并|
用于联合类型.
我确信还有另一种方式来看待它,但我无法弄明白.
我试图在打字稿中获得关于并集和交集类型的直觉,但我无法弄清楚这种情况:Playground Link
interface A {
a: number;
}
interface B{
b: boolean;
}
type UnionCombinedType = A | B;
type IntersectionType = A & B;
const obj: UnionCombinedType = {
a: 6,
b: true,
}
const obj2: IntersectionType = {
a: 6,
b: true,
}
Run Code Online (Sandbox Code Playgroud)
为什么我允许将两个值都放入交集类型中?两个界面之间的交集是空的。如果我读到&
asAND
那么我很清楚为什么它允许我添加两个 props,但是我应该读到关键字|
asOR
并且我希望它允许我只分配a
或b
而不是两者都分配。
有人能给我一些关于这些类型的直觉吗?
为了练习,我写了这段代码:
type Cat = {name: string, purrs: boolean};
type Dog = {name: string, barks: boolean, bites: boolean};
type CatOrDogOrBoth = Cat | Dog;
type CatAndDog = Cat & Dog;
let pet1 : CatOrDogOrBoth = {name: "pooky", purrs: true, bites: false};
let pet2 : CatAndDog = {name: "Timmy" };
Run Code Online (Sandbox Code Playgroud)
但是pet2TypeScript
上的编译器错误说我需要添加到我的对象中。但是这两种类型的交集不是只有name属性吗?purrs
CatAndDog