为什么Flow不会根据它返回的内容推断出函数的类型?

And*_*rov 8 typescript flowtype

我希望这段代码能像在TypeScript中一样在Flow中输入check :

var onClick : (() => void) | (() => boolean);
onClick = () => { return true; }
Run Code Online (Sandbox Code Playgroud)

相反,我收到此错误:

4: onClick = () => { return true; }
             ^ function. Could not decide which case to select
3: var onClick : (() => void) | (() => boolean);
                  ^ union type
Run Code Online (Sandbox Code Playgroud)

这个设计决定是否有通用名称,背后的原因是什么?

是否可以要求Flow检查器从return语句推断函数的返回类型?

Rod*_*ris 4

您需要提供显式强制转换,例如:

type FuncV = () => void;
type FuncB = () => boolean;
var onClick : FuncV | FuncB;

onClick = (() => { return true; }: FuncB);
Run Code Online (Sandbox Code Playgroud)

或者使用存在类型,例如:

type Func<T: (void | string)> = () => T;
var f: Func<*>;

f = () => { return "hello"; };
var msg = f() + " world!";  // type checks against return value above
Run Code Online (Sandbox Code Playgroud)