Typescript:理解并集和交集类型

kun*_*aba 21 union intersection typescript

我试图在打字稿中获得关于并集和交集类型的直觉,但我无法弄清楚这种情况: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并且我希望它允许我只分配ab而不是两者都分配。

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

Les*_*iak 18

鉴于以下情况:

\n
interface A {\n    a: number;\n    c: number;\n}\n\ninterface B{\n    b: boolean;\n    c: number;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Union 类型的表达式A | B可分配给AB。它必须具有来自AB(或两者)的属性

\n
const oA: A | B = {\n    a: 6,\n    c: 6\n}\n\nconst oB: A | B = {\n    b: true,\n    c: 6\n}\n\nconst oC: A | B = {\n    a: 6,\n    b: true\n    c: 6\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是像这样的类型A | B有什么操作呢?\n只有那些同时属于A和 的操作B

\n
oA.c = 1; // valid\n
Run Code Online (Sandbox Code Playgroud)\n

交集类型A & B,如果它可分配给 A 和 B(因此必须同时具有 A 和 B 的属性)。

\n
const obj: A & B = {\n    a: 6,\n    b: true,\n    c: 1\n}\n
Run Code Online (Sandbox Code Playgroud)\n

更新

\n

您问“为什么示例中的 A 和 B 可以采用 b 属性?它不能分配给 A 类型”

\n

这显然是不正确的。\n任何具有 A 的所有属性的类型都可以分配给 A。额外的属性不会造成任何损害:

\n
const aAndExtraProp = {\n  a: 6,\n  d: 6\n};\n\nconst ca0: A = aAndExtraProp;\n
Run Code Online (Sandbox Code Playgroud)\n

您可能对超额财产检查感到困惑感到困惑:

\n
\n

对象字面量在将它们分配给其他变量或将它们作为参数传递时会受到特殊处理并进行过多的属性检查。如果对象字面量具有 \xe2\x80\x9c 目标类型\xe2\x80\x9d 不具有\xe2\x80\x99t 的任何属性,则\xe2\x80\x99 将收到错误:

\n
\n
const ca1: A = {\n  a: 6,\n  d: 6 //ERROR\n};\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这样想:联合类型的变量可以接受 A 或 B 对象。如果使用它,您只能访问公共属性,否则您必须以某种方式区分两者。在其他语言中,这通常是通过运行时类型检查和向下转型来完成的。在打字稿中,通常使用可区分的联合类型。相反,交集类型的变量仅接受同时为 A 和 B 的对象(具有 A 和 B 的属性,因为 Typescript 使用名义类型)。您可以使用 A 和 B 中的任何属性。 (3认同)