将静态变量添加到类类型的并集

时间:2018-09-26 00:50:44

标签: flowtype

我试图表示类型Base1Base2的子类,并添加一个静态属性foo: string。 / p>

我尝试了以下操作,但出现错误:

(flow.org/try link)

// @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()强制转换为IFooBase2 [1]与Base1 [2]不兼容。或对象类型[3]与Base1 [4]的静态不兼容。或Base1 [2]与Base2 [1]不兼容。或对象类型[3]与Base2 [5]的静态不兼容。

我可以通过删除& {+foo: string}或通过删除| Class<Base2>来解决错误,但这都是我要代表的类型的关键要求。

似乎问题的症结可能是“ 对象类型与Base1 的静态不兼容”。我可以使用其他技术来添加静态属性吗?

1 个答案:

答案 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);

Link

过去,我在使用交集类型的联合与联合类型的交集时遇到类似的问题,通常只需尝试其中一种,直到可行。