Javascript 为什么函数的交集类型接受其中一种类型声明,而不是同时接受两种类型声明?

Javascript 为什么函数的交集类型接受其中一种类型声明,而不是同时接受两种类型声明?,javascript,flowtype,Javascript,Flowtype,我举了个例子 /* @flow */ class Foo {} class Bar {} declare var f: ((x: Foo) => void) & ((x: Bar) => void); f(new Foo()); 从文档页面 这种代码类型检查时没有错误 对我来说,结果不是很明显 正如他们在页面顶部附近的某个地方用另一个示例所示: /* @flow */ type I = {a: number} & {b: number}; var x: I = {a

我举了个例子

/* @flow */
class Foo {}
class Bar {}
declare var f: ((x: Foo) => void) & ((x: Bar) => void);
f(new Foo());
从文档页面

这种代码类型检查时没有错误

对我来说,结果不是很明显

正如他们在页面顶部附近的某个地方用另一个示例所示:

/* @flow */
type I = {a: number} & {b: number};
var x: I = {a: 1, b: 2};
x = {a: 1, b: 2, c: "three"};
交叉点(来自术语语义本身)是两种(或更多)类型的复合。基本上是

那么,为什么
f(newfoo())是否未通过类型检查?
new Foo()
参数显然不是
条的实例,因此不能通过

我错过了什么

UPD


经过进一步研究,我发现当你使用
声明var
(与
类型
或就地键入相比,
&
的含义是互换的。我无法找到一个解释,为什么它会在一开始就发生。

我可能误解了你的问题,但我希望它会进行打字检查。参数
new Foo()
具有类型
Foo
,因此只要
f
具有类型
Foo=>…
,应用程序就应该是正常的。是的。(它还有类型
Bar=>…

作为比较,如果
f
具有类型
(x:Foo&Bar)=>void
,则不会进行类型检查,因为
new Foo
,当然是类型
Foo
,但也不是类型
Bar


另一个比较是,如果
f
有type
((x:Foo)=>void)|((x:Bar)=>void)
,则不会进行打字检查。参数
newfoo
的类型为
Foo
,虽然
f
可能有类型
Foo=>void
,但它可能有类型
Bar=>void

,我只引用文档:“交集类型需要一个值作为所有输入类型:”。在本例中,参数不满足此条件,因为
f(newfoo())不是
((x:Bar)=>void)
类型。另一个有争议的例子:
declare var
declare type
表现不同:嗯,我不太明白:
(x:Bar)=>void
类型是用于
f
本身,而不是
f(new Foo())
。我们说的是
f
函数既是
(x:Foo)=>void
类型,也是
(x:Bar)=>void
类型;因此,调用类型为
Foo
的参数是可以的。在您的try-flow示例中,问题是您说过
a
具有类型
F=((x:Foo)=>void)和((x:Bar)=>void)
,但它没有!它只有类型
(x:Foo)=>void
。但是,如果您将
a
的定义更改为
函数(x:Foo | Bar)
,它将再次进行打字检查。现在我明白了您的意思,但这对我来说仍然是违反直觉的:-s