Chr*_*fer 4 javascript flowtype
我正在尝试编写一些非常简单的功能示例来评估Flow类型系统.我错过了一些明显的东西,或者这个样本是否有用:
function logger (message: string): void {
console.log(message);
}
function consumer (logFunc: logger) {
logFunc('foo');
}
consumer(logger);
Run Code Online (Sandbox Code Playgroud)
当我尝试使用Try Flow时,我会在原型中找到"Callable signature".我在本地运行时得到相同的消息(流量0.21.0):
8: logFunc('foo');
^^^^^^^^^^^^^^ function call. Callable signature not found in
8: logFunc('foo');
^^^^^^^ prototype
Run Code Online (Sandbox Code Playgroud)
我可以通过明确声明类型别名来解决问题,但这似乎是不必要的重复(特别是对于更复杂的模块):
type loggerType = (message: string) => void;
function logger (message: string): void {
console.log(message);
}
function consumer (logFunc: loggerType) {
logFunc('foo');
}
consumer(logger);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的唯一相关文档是:http://flowtype.org/docs/functions.html#function-based-type-annotations
试想一下,consumer并logger有单独的模块(甚至在不同的NPM包),而且更复杂,logger是进口的(ES6,或CommonJS的).
logger和loggerType)似乎是不合理的.logger的consumer功能-我想要的类型logFunc参数调用该函数完全匹配logger.特别是,重复这些类型对于更复杂的功能来说将是乏味的.关于如何在不明确重复类型注释的情况下完成此任务的任何想法?
你可以使用typeof:
function consumer (logFunc: typeof logger) {
logFunc('foo');
}
Run Code Online (Sandbox Code Playgroud)
看起来像一个Flow bug,在类型位置使用表达式并没有给你一个有意义的错误,但我不熟悉它,所以它可能意味着别的东西.
这里的错误体验非常混乱 - 你可能会更好地使用类型别名.当然在这个片段中我更喜欢第15行而不是第1和第9行的错误