【发布时间】:2019-08-24 11:05:42
【问题描述】:
寻找了解静态类型检查器流程的人向我解释我在哪里走错了路。我试图理解子类型函数的交集。
我知道对函数进行子类型化需要逆变输入和协变输出,但似乎这并不能解决所有问题。
举个例子
type InterT = ((number) => string) & ((string) => number);
通过简单的测试,这似乎归结为(number & string) => number | string。有效的子类型包括
declare var I: InterT;
declare var test1: ((number) => number | string) => void;
test1(I); // works
declare var test2: ((string) => number | string) => void;
test2(I); // works
declare var test3: ((number & string) => number) => void;
test3(I); // works
declare var test4: ((number & string) => string) => void;
test4(I);
declare var test5: ((number | string) => number | string) => void;
test5(I); // works
declare var test6: ((number | string) => string) => void;
test6(I); // FAILS
declare var test7: ((number | string) => number) => void;
test7(I);
为什么最后两种情况都失败了? string <: number | string 和 number <: number | string,对吗?
【问题讨论】:
标签: javascript facebook flowtype