Javascript Can';t将对象数组分配给流中的联合类型数组
我正在学习Flow,因此我正在用JavaScript和Flow做一个小爱好项目。我有一个类Javascript Can';t将对象数组分配给流中的联合类型数组,javascript,flowtype,Javascript,Flowtype,我正在学习Flow,因此我正在用JavaScript和Flow做一个小爱好项目。我有一个类Foo和一个不同的类Bar,我想在构造函数中将Foo对象数组作为一个选项。但是,我还希望能够为每个这样的对象发送一些其他数据,因此我希望有一个数组,其中每个元素要么是普通的Foo对象,要么是封装在数组或对象中的Foo对象 然而,当我试图为此编写代码时,我遇到了一些奇怪的错误,我不理解其原因。据我所知,它认为存在类型冲突,因为Foo不兼容联盟的所有类型,但据我所知,它应该只兼容至少一种类型 下面是我需要的最小
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
)进行声明,唯一的区别是在第一行中类型是隐式的,而在第二行中类型是显式的。除非我严重误解了流类型是如何工作的,否则我看不出它们的行为会有什么不同(尽管看起来确实如此)。这个问题可能与此有关吗?