打字稿:了解联合和交叉点类型

时间:2020-04-22 16:59:28

标签: typescript union intersection

我正在尝试了解打字稿中的并集和相交类型,但是我无法弄清楚这种情况: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,我会希望它允许我仅分配ab,但不能同时分配两者。

有人可以给我一些关于这些类型的直觉吗?

2 个答案:

答案 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的表达式可分配给AB。它必须具有AB(或两者)中的属性

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这样的类型有什么操作? 仅属于AB的这些

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
};