为什么函数的交集类型接受任何类型的声明而不是两者都接受?

时间:2017-01-22 12:37:51

标签: javascript flowtype

我举了个例子

/* @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或就地打字时)交换。我找不到解释为什么它甚至发生在第一个地方。

1 个答案:

答案 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类型。