Typescript 打字错误?当定义为接受类型A和B的并集(其中B扩展A)时,函数接受缺少prop的对象

Typescript 打字错误?当定义为接受类型A和B的并集(其中B扩展A)时,函数接受缺少prop的对象,typescript,Typescript,这可能是一个bug或者我不理解联合类型。请看下面的代码: ​ 最后一行不应编译,因为x的存在强制执行类型B,但y缺失,因此它实际上应该是无效的。联合类型用于声明一个或两个类型 例如: interface A { a1: string; a2: string; } interface B { b1: string; b2: string; } const e1: A|B = {a1: "1", a2:"1"} // valid con

这可能是一个bug或者我不理解联合类型。请看下面的代码:


最后一行不应编译,因为
x
的存在强制执行类型
B
,但
y
缺失,因此它实际上应该是无效的。

联合类型用于声明一个或两个类型

例如:

interface A {
  a1: string;
  a2: string;
}

interface B {
  b1: string;
  b2: string;
}

const e1: A|B = {a1: "1", a2:"1"}  // valid
const e2: A|B = {b1: "1", b2:"1"}  // valid
const e3: A|B = {a1: "1", b1:"1"}  // invalid
在您的示例中,您试图将
{a:asdf,x:false}
分配给
a | B
。 由于类型
A
接受几乎任何东西(甚至
{}
),那么
{A:“asdf”,x:false}
可以分配给
A | B

它之所以没有抛出关于存在
B
属性的错误,是因为
a | B
允许值是两者的混合。它必须至少是A或B,但可以“激励”两者兼而有之

这就是为什么这也是有效的

printCoord({ a: "asdf" });  // valid

但是A不接受任何东西。将函数更改为仅接受A,最后一行将失败,因为x不是A的一部分。因此,这只剩下B作为可能的类型,需要同时存在x和y。它甚至不必是函数,
const test:A | B={A:“asdf”,x:false}
也有效。甚至
const-test:A | B={A:undefined,x:false}
。只有当您移除
a
时,魔法才会消失。只要值具有所有交集字段,TS就可以使用并集,这对我来说意味着不能执行
const test:a | B={x:false}
是一个错误,而您的情况是预期的行为。不管怎样,这会给你带来什么问题吗?
printCoord({ a: "asdf" });  // valid