我正在尝试了解打字稿中的并集和相交类型,但是我无法弄清楚这种情况: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,
}
为什么我允许将两个值都放入交集类型?两个接口之间的交集为空。如果我将&
读为AND
,那么我很清楚为什么它允许我同时添加两个道具,但是我应该将|
关键字读为OR
,我会希望它允许我仅分配a
或b
,但不能同时分配两者。
有人可以给我一些关于这些类型的直觉吗?
答案 0 :(得分:2)
从联合类型接受的角度考虑。一套 可以分配给字符串的东西|数字字段是 所有字符串的集合和所有数字的集合。这套东西 可以分配给字符串和数字的东西什么都不是,因为有 所有字符串的集合和所有数字的集合中都没有重叠。
我认为您是在现场将其描绘为集合运算符,而不是 而不是每种类型代表的集合的集合运算符。
///////////////////////
这是数学术语:“类型”是其所有元素的集合 可能的值,例如boolean = {true,false};。现在类型T的并集 U是由T或U中的值组成的集合(即T与 U); T和U中值的交集相似(即公共部分 其中的)。
只要所有可能的值都可以访问成员。对于工会, 类型T | U的值可能是T或可能是U。我们不知道只有哪个 通用属性是合法的。如您所见,对类型的操作意味着 不同但互补的成员操作。这是一个 德摩根法律的后果。
https://www.reddit.com/r/typescript/comments/9qduq3/why_is_type_intersection_called_like_that_its/
答案 1 :(得分:1)
给出以下内容:
interface A {
a: number;
c: number;
}
interface B{
b: boolean;
c: number;
}
联合类型A | B
的表达式可分配给A
或B
。它必须具有A
或B
(或两者)中的属性
const oA: A | B = {
a: 6,
c: 6
}
const oB: A | B = {
b: true,
c: 6
}
const oC: A | B = {
a: 6,
b: true
c: 6
}
但是A | B
这样的类型有什么操作?
仅属于A
和B
的这些
oA.c = 1; // valid
交叉点类型A & B
,如果交叉点类型既可以分配给A也可以分配给B(因此必须同时具有A和B的属性)。
const obj: A & B = {
a: 6,
b: true
}
更新
您问“为什么示例中的A和B可以使用b属性?不能分配给A类型”
这显然是不正确的。 具有A所有属性的任何类型都可以分配给A。其他属性无害:
const aAndExtraProp = {
a: 6,
d: 6
};
const ca0: A = aAndExtraProp;
您可能对Excess Property Checks的对象文字感到困惑:
对象字面量在分配给其他变量或作为参数传递时会受到特殊对待,并进行多余的属性检查。如果对象文字具有“目标类型”所没有的任何属性,则会出现错误:
const ca1: A = {
a: 6,
d: 6 //ERROR
};