【发布时间】:2018-08-21 03:06:53
【问题描述】:
我正在尝试编写一些非常简单的功能示例来评估 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)似乎不合理。 - 在
consumer函数中重复logger的类型签名似乎也不合理——我希望logFunc参数的类型与名为logger的函数完全匹配。特别是,对于更复杂的功能,重复这些类型会很乏味。
关于如何在不显式重复类型注释的情况下完成此操作的任何想法?
【问题讨论】:
标签: javascript flowtype