我举了个例子
/* @flow */
class Foo {}
class Bar {}
declare var f: ((x: Foo) => void) & ((x: Bar) => void);
f(new Foo());
来自文档页面https://flowtype.org/docs/union-intersection-types.html#_
此代码类型检查没有错误。
对我来说,结果并不是很明显。
因为它们显示在页面顶部附近的另一个例子:
/* @flow */
type I = {a: number} & {b: number};
var x: I = {a: 1, b: 2};
x = {a: 1, b: 2, c: "three"};
交集(从术语语义本身流出)是2(或更多)类型的复合。基本上是AND
。
那么,为什么f(new Foo());
没有通过类型检查失败呢? new Foo()
参数显然不是Bar
的实例,因此不能通过。
我错过了什么?
UPD
经过一些研究后,我发现|
和&
的含义在您使用declare var
(与type
或就地打字时)交换。我找不到解释为什么它甚至发生在第一个地方。
答案 0 :(得分:2)
我可能误解了你的问题,但我希望它可以解决问题。参数new Foo()
的类型为Foo
,因此只要f
具有类型Foo => ...
,应用程序就可以正常运行。确实如此。 ( 的类型为Bar => ...
)。
为了进行比较,如果f
的类型为(x: Foo & Bar) => void
,则事情不会进行类型检查,因为new Foo
虽然类型为Foo
,但也不属于Bar
类型1}}。
对于另一个比较,如果f
的类型为((x: Foo) => void) | ((x: Bar) => void)
,那么事情就不会出现问题。参数new Foo
的类型为Foo
,虽然f
可能包含Foo => void
类型,但它可能包含Bar => void
类型。