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并且我希望它允许我只分配a或b而不是两者都分配。
有人能给我一些关于这些类型的直觉吗?
Les*_*iak 18
鉴于以下情况:
\ninterface A {\n a: number;\n c: number;\n}\n\ninterface B{\n b: boolean;\n c: number;\n}\nRun Code Online (Sandbox Code Playgroud)\nUnion 类型的表达式A | B可分配给A或B。它必须具有来自A或B(或两者)的属性
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}\nRun Code Online (Sandbox Code Playgroud)\n但是像这样的类型A | B有什么操作呢?\n只有那些同时属于A和 的操作B
oA.c = 1; // valid\nRun Code Online (Sandbox Code Playgroud)\n交集类型A & B,如果它可分配给 A 和 B(因此必须同时具有 A 和 B 的属性)。
const obj: A & B = {\n a: 6,\n b: true,\n c: 1\n}\nRun Code Online (Sandbox Code Playgroud)\n更新
\n您问“为什么示例中的 A 和 B 可以采用 b 属性?它不能分配给 A 类型”
\n这显然是不正确的。\n任何具有 A 的所有属性的类型都可以分配给 A。额外的属性不会造成任何损害:
\nconst aAndExtraProp = {\n a: 6,\n d: 6\n};\n\nconst ca0: A = aAndExtraProp;\nRun Code Online (Sandbox Code Playgroud)\n您可能对超额财产检查感到困惑感到困惑:
\n\n\n对象字面量在将它们分配给其他变量或将它们作为参数传递时会受到特殊处理并进行过多的属性检查。如果对象字面量具有 \xe2\x80\x9c 目标类型\xe2\x80\x9d 不具有\xe2\x80\x99t 的任何属性,则\xe2\x80\x99 将收到错误:
\n
const ca1: A = {\n a: 6,\n d: 6 //ERROR\n};\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
14389 次 |
| 最近记录: |