我试图编写一些非常简单的功能示例来评估Flow类型系统。我错过了一些明显的东西,或者这个样本是否有效:
function logger (message: string): void {
console.log(message);
}
function consumer (logFunc: logger) {
logFunc('foo');
}
consumer(logger);
当我在Try Flow上尝试时,我得到"在原型"中找不到可调用签名。我在本地运行时收到相同的消息(流量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
想象一下consumer
和logger
是单独的模块(甚至可能在单独的npm包中)并且更复杂,导入logger
(es6或commonJS)。
logger
和loggerType
)似乎不合理。 logger
函数中重复consumer
的类型签名似乎也不合理 - 我希望logFunc
参数的类型与调用的函数完全匹配logger
。特别是,重复这些类型对于更复杂的功能来说将是乏味的。 关于如何在不明确重复类型注释的情况下完成此任务的任何想法?