我试图编写一些非常简单的功能示例来评估流类型系统。我是不是遗漏了一些显而易见的东西,或者这个样本是否有效:
function logger (message: string): void {
console.log(message);
}
function consumer (logFunc: logger) {
logFunc('foo');
}
consumer(logger);当我在试流上试用它时,我会得到“原型中找不到的可调用签名”。在本地运行(流程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的函数完全匹配。特别是,对于更复杂的函数来说,重复这些类型将是乏味的。对于如何在不显式重复类型注释的情况下实现这一点,有什么想法吗?
发布于 2016-02-17 21:52:17
您可以使用typeof
function consumer (logFunc: typeof logger) {
logFunc('foo');
}似乎是一个流错误,在类型位置使用表达式不会给您带来有意义的错误,但是我不太熟悉它,所以它可能意味着其他的东西。
但是,这里的错误体验非常令人困惑--使用类型别名可能会更好。当然,在这个片段中,我更希望在第15行出现错误,而不是在第1和第9行上出错。

https://stackoverflow.com/questions/35445393
复制相似问题