javascript - 为什么函数的交集类型接受其中一个类型声明而不是两者都接受?

标签 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 或就地输入)。不过,我无法找到为什么它一开始就发生的解释。

最佳答案

我可能误解了你的问题,但我希望它能进行类型检查。参数 new Foo() 的类型为 Foo,因此只要 f 的类型为 Foo =,应用程序就应该没问题> ...。确实如此。 (它有类型 Bar => ...)。

作为比较,如果 f 的类型为 (x: Foo & Bar) => void,则不会进行类型检查,因为 new Foo,虽然肯定是 Foo 类型,但不是 Bar 类型。

另一个比较,如果 f 的类型是 ((x: Foo) => void) | ((x: Bar) => void),事情不会进行类型检查。参数 new Foo 的类型为 Foo,虽然 f 的类型可能为 Foo => void,但它可能取而代之的是 Bar => void 类型。

关于javascript - 为什么函数的交集类型接受其中一个类型声明而不是两者都接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41790973/

相关文章:

flowtype - 使用 Flow 输入具有默认属性的对象

javascript - 从语言文件加载时缺少一半字符串

javascript - 如何修复增量按钮将数字添加到值的末尾而不是在 onChange 之后递增

javascript - AngularJS - 指令包装而不丢失与 Controller 的连接

flowtype - 错误 : react-navigation_v1. x.x/CONTRIBUTING.md:意外的文件名

flowtype - React.cloneElement 不精确类型与精确类型不兼容

javascript - Flowtype 多态性不起作用

javascript - 长轮询, "Global"按钮,向所有人广播?

javascript - 初始化多个变量时如何减少代码量

flowtype - 使用流时忽略 node_modules