无法将对象数组分配给Flow中的联合类型数组

Frx*_*rem 11 javascript flowtype

我正在学习Flow,因此我正在开发一个带有JavaScript和Flow的小爱好项目.我有一个类Foo和一个不同的类Bar,我想在一个Foo对象数组中作为构造函数中的一个选项.但是,我还希望能够为每个这样的对象发送一些其他数据,因此我希望有一个数组,其中每个元素都是普通Foo对象,或者Foo包含在数组或对象中的对象.

但是,当我尝试为此编写代码时,我得到了一些奇怪的错误,我不明白其中的原因.据我所知,它认为存在类型冲突,因为Foo它与所有类型的联合不兼容,但据我所知它应该只需要与它们中的至少一个兼容......

这是重现我得到的确切错误所需的最小代码(链接到Try Flow示例):

// @flow

class Foo { }

interface BarOptions {
  foos: ( Foo | [ Foo ] | { foo: Foo } )[];           // line 6
}

class Bar {
  constructor(options?: BarOptions) { }
}

const foo: Foo = new Foo();

const bar = new Bar({
  foos: [ foo ],                                    // line 16
});
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Line 6:
  tuple type: This type is incompatible with Foo
  object type: This type is incompatible with Foo
Line 16:
  tuple type: This type is incompatible with Foo
  object type: This type is incompatible with Foo
Run Code Online (Sandbox Code Playgroud)

这些错误是否有直观(或不直观)的原因?

hom*_*mam 2

我认为BarOptions实际上应该是类型别名而不是接口。接口声明类可以实现的类型。接口不是数据类型,它们不应该有字段(包含数据)。

interface BarOptions如果我们更改为,一切都会正常type BarOptions =

或者,您可以更改foo为 getter 函数:

interface BarOptions {
  foos(): ( Foo | [ Foo ] | { foo: Foo } )[];
}
Run Code Online (Sandbox Code Playgroud)