高阶函数,Flow类型注解

Higher order function, Flow type annotations

我正在尝试编写一些非常简单的功能性示例来评估 Flow 类型系统。我是不是遗漏了一些明显的东西,或者这个示例应该有效:

function logger (message: string): void {
    console.log(message);
}

function consumer (logFunc: logger) {
    logFunc('foo');
}

consumer(logger);

当我在 Try Flow 上尝试时,我得到 "Callable signature not found in prototype"。我在 运行 本地(流 0.21.0)时收到相同的消息:

  8:     logFunc('foo');
         ^^^^^^^^^^^^^^ function call. Callable signature not found in
  8:     logFunc('foo');
         ^^^^^^^ prototype

我可以通过显式声明类型别名来解决问题,但这似乎是不必要的重复(尤其是对于更复杂的模块):

type loggerType = (message: string) => void;

function logger (message: string): void {
    console.log(message);
}

function consumer (logFunc: loggerType) {
    logFunc('foo');
}

consumer(logger);

到目前为止我找到的唯一相关文档是:http://flowtype.org/docs/functions.html#function-based-type-annotations

假设 consumerlogger 是独立的模块(甚至可能在单独的 npm 包中)并且更复杂,并且 logger 是导入的(es6,或 commonJS)。

关于如何在不显式重复类型注释的情况下完成此操作的任何想法?

您可以使用 typeof:

function consumer (logFunc: typeof logger) {
    logFunc('foo');
}

似乎是一个 Flow 错误,在类型位置使用表达式不会给你一个有意义的错误,但我不太熟悉它,所以它可能有其他含义。

不过,这里的错误体验相当令人困惑——使用类型别名可能会更好。当然,在这个片段中,我更希望第 15 行出现错误,而不是第 1 行和第 9 行