我试图表示类型“ Base1
或Base2
的子类,并添加一个静态属性foo: string
” 。 / p>
我尝试了以下操作,但出现错误:
// @flow
class Base1 { }
class Base2 { }
class Foo extends Base1 {
static foo = "hi"
}
type IBase = Class<Base1> | Class<Base2>;
type IFoo = IBase & {+foo: string}
(Foo: IFoo); // no error
function getFoo(): IFoo {
return Foo; // no error
}
(getFoo(): IFoo); // error
由于以下原因,无法将
getFoo()
强制转换为IFoo
:Base2
[1]与Base1
[2]不兼容。或对象类型[3]与Base1
[4]的静态不兼容。或Base1
[2]与Base2
[1]不兼容。或对象类型[3]与Base2
[5]的静态不兼容。
我可以通过删除& {+foo: string}
或通过删除| Class<Base2>
来解决错误,但这都是我要代表的类型的关键要求。
似乎问题的症结可能是“ 对象类型与Base1
的静态不兼容”。我可以使用其他技术来添加静态属性吗?
答案 0 :(得分:0)
不了解此处的逻辑,但这似乎出于某些原因而起作用:
type IFoo = IBase & {+foo: string};
type IFoo2 = Class<Base1> & {+foo: string} | Class<Base2> & {+foo: string};
(Foo: IFoo); // no error
function getFoo(): IFoo2 { // change return type to IFoo2
return Foo; // no error
}
(getFoo(): IFoo); // huh?
(getFoo(): IFoo2);
过去,我在使用交集类型的联合与联合类型的交集时遇到类似的问题,通常只需尝试其中一种,直到可行。