Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';t将对象数组分配给流中的联合类型数组_Javascript_Flowtype - Fatal编程技术网

Javascript Can';t将对象数组分配给流中的联合类型数组

Javascript Can';t将对象数组分配给流中的联合类型数组,javascript,flowtype,Javascript,Flowtype,我正在学习Flow,因此我正在用JavaScript和Flow做一个小爱好项目。我有一个类Foo和一个不同的类Bar,我想在构造函数中将Foo对象数组作为一个选项。但是,我还希望能够为每个这样的对象发送一些其他数据,因此我希望有一个数组,其中每个元素要么是普通的Foo对象,要么是封装在数组或对象中的Foo对象 然而,当我试图为此编写代码时,我遇到了一些奇怪的错误,我不理解其原因。据我所知,它认为存在类型冲突,因为Foo不兼容联盟的所有类型,但据我所知,它应该只兼容至少一种类型 下面是我需要的最小

我正在学习Flow,因此我正在用JavaScript和Flow做一个小爱好项目。我有一个类
Foo
和一个不同的类
Bar
,我想在构造函数中将
Foo
对象数组作为一个选项。但是,我还希望能够为每个这样的对象发送一些其他数据,因此我希望有一个数组,其中每个元素要么是普通的
Foo
对象,要么是封装在数组或对象中的
Foo
对象

然而,当我试图为此编写代码时,我遇到了一些奇怪的错误,我不理解其原因。据我所知,它认为存在类型冲突,因为
Foo
不兼容联盟的所有类型,但据我所知,它应该只兼容至少一种类型

下面是我需要的最小代码来重现我得到的确切错误():

/@flow
类Foo{}
界面气压选择{
foos:(Foo |[Foo]{Foo:Foo})[];//第6行
}
分类栏{
构造函数(选项?:BarOptions){}
}
const-foo:foo=new-foo();
常数条=新条({
foos:[foo],//第16行
});
我得到以下错误:

第6行:
元组类型:此类型与Foo不兼容
对象类型:此类型与Foo不兼容
第16行:
元组类型:此类型与Foo不兼容
对象类型:此类型与Foo不兼容

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

我认为
BarOptions
实际上应该是一个类型别名,而不是一个接口。接口。接口不是数据类型,它们不应该有字段(包含数据)

如果我们将
接口BarOptions
更改为
类型BarOptions=
,一切都可以正常工作

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

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

你认为这可能与这个开放的Github有关吗?如果我们将
接口
替换为
类型
,它将验证:

// @flow

class Foo { }

type BarOptions ={
  foos: 
        Class<Foo> |
        Foo |
        Foo[] |
        { foo: Foo } 
}

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

const foo: Foo = new Foo();

const bar = new Bar({
  foos: Foo,
//   foos: foo,
//   foos: [foo],
//   foos: { foo: foo },
});
/@flow
类Foo{}
类型气压选择={
福斯:
阶级|
福|
Foo[]|
{foo:foo}
}
分类栏{
构造函数(选项?:BarOptions){}
}
const-foo:foo=new-foo();
常数条=新条({
foos:Foo,
//foos:foo,
//foos:[foo],
//foos:{foo:foo},
});

您能解释一下这是否可行吗?(我的问题不是如何解决它,而是试图理解为什么这首先是一个问题)我看不出两者有什么不同;据我所知,在这两种情况下,
foo
都将使用相同的类型(
foo
)进行声明,唯一的区别是在第一行中类型是隐式的,而在第二行中类型是显式的。除非我严重误解了流类型是如何工作的,否则我看不出它们的行为会有什么不同(尽管看起来确实如此)。这个问题可能与此有关吗?