我试图表示类型“Base1
或Base2
__的一个子类,并添加一个静态属性foo: string
__”。
我尝试了以下方法,但是我得到了一个错误:
// @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>
来修复错误,但这两者都是我想要表示的类型的关键要求。
问题的症结似乎是“对象类型与的静力学不兼容”。有什么不同的技术可以用来添加静态属性吗?
发布于 2018-10-18 21:55:05
不理解这里的逻辑,但这似乎是出于某种原因:
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);
在过去,我有过类似的问题,使用交交类型和联合类型的交集,通常只是尝试其中一种或另一种,直到它起作用。
https://stackoverflow.com/questions/52508434
复制相似问题