假设定义了以下类型:
type A = {
a: string,
}
type B = {
a: number,
b: number,
}
这两个赋值会产生错误:
// Not assignable to A because 'b' doesn't exist on A
const x: A = {
a: 'hello',
b: 10
}
// Not assignable to B because 'a' expects type 'string'
const x: B = {
a: 'hello',
b: 10
}
TypeScrip的文档将联合类型定义为:
联合类型是由两个或多个其他类型组成的类型,表示的值可以是这些类型中的任何一个.
基于此,我本以为下面的声明会产生错误:
const x: A | B = {
a: 'hello',
b: 10
}
但事实并非如此.从字面上看,该对象不能赋值给类型A
,也不能赋值给类型B
,但它却可以赋值给A | B
.
我如何才能以一种使这个结果有意义的方式来考虑类型联合呢?
编辑:当然,我搜索了半天,找不到记录这件事的信息,但我一发帖,就发现这里有很多其他帖子在谈论同样的事情.
根据我所发现的,对象文本在被分配为类型联合时可以具有额外的属性,只要其中一个成员具有该属性.
如果我理解正确的话,我的对象字面量满足类型A
,属性b
是多余属性,这是允许的,因为联合的另一个成员(B
)包括该属性.
为什么TypeScript的 struct 类型(即"鸭子类型")需要非严格类型联合?从我看到的与此相关的SO帖子的数量来看,似乎大多数人都希望类型联盟是严格的.我敢肯定,有一个令人信服的理由,非严格的unions 是默认的,有人能提供一些直觉,为什么会这样?