我构造一个并集是为了允许一个类型具有两个属性中的一个或另一个,但不能同时具有这两个属性。以下是我正在使用的:
type ObjBase = {
foo: string
}
type ObjBaseWithBoo = ObjBase & {
boo: string
goo?: never
}
type ObjBaseWithGoo = ObjBase & {
goo: string
boo?: never
}
type ObjType = ObjBaseWithBoo | ObjBaseWithGoo
我的问题是,如果我有两个这样的对象,我不能直接将一个对象的属性赋值给另一个对象的属性。所以如果我有
obj
和
objTwo
,两种类型
ObjType
,此任务失败:
let objTwo: ObjType = {
foo: obj.foo,
boo: obj.boo,
goo: obj.goo
}
Typescript抱怨说:
Type '{ foo: string; boo: string | undefined; goo: string | undefined; }' is not assignable to type 'ObjType'.
Type '{ foo: string; boo: string | undefined; goo: string | undefined; }' is not assignable to type 'ObjBaseWithGoo'.
Type '{ foo: string; boo: string | undefined; goo: string | undefined; }' is not assignable to type '{ goo: string; boo?: undefined; }'.
Types of property 'goo' are incompatible.
Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'.(2322)
但我认为这是不对的。给定定义类型的方式,如果
obj.boo
可转让给
objTwo.boo
然后
obj.goo
objTwo.goo
. 这只是TS分析的局限性,还是我遗漏了更基本的东西?
这是我的建议
playground
(FWIW:除了提高我对TS的理解外,这一点很重要的原因是,这种“一个或另一个”结构对于在React中使用其他道具很有用,但如果你不能将这些道具传给孩子们,那么使用起来会很痛苦。)