高阶函数,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
假设 consumer
和 logger
是独立的模块(甚至可能在单独的 npm 包中)并且更复杂,并且 logger
是导入的(es6,或 commonJS)。
- 写两次类型似乎不太合理(
logger
和loggerType
)。
- 在
consumer
函数中重复 logger
的类型签名似乎也不合理 - 我希望 logFunc
参数的类型与调用的函数完全匹配logger
。特别是,对于更复杂的功能,重复类型会很乏味。
关于如何在不显式重复类型注释的情况下完成此操作的任何想法?
您可以使用 typeof
:
function consumer (logFunc: typeof logger) {
logFunc('foo');
}
似乎是一个 Flow 错误,在类型位置使用表达式不会给你一个有意义的错误,但我不太熟悉它,所以它可能有其他含义。
不过,这里的错误体验相当令人困惑——使用类型别名可能会更好。当然,在这个片段中,我更希望第 15 行出现错误,而不是第 1 行和第 9 行
我正在尝试编写一些非常简单的功能性示例来评估 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
假设 consumer
和 logger
是独立的模块(甚至可能在单独的 npm 包中)并且更复杂,并且 logger
是导入的(es6,或 commonJS)。
- 写两次类型似乎不太合理(
logger
和loggerType
)。 - 在
consumer
函数中重复logger
的类型签名似乎也不合理 - 我希望logFunc
参数的类型与调用的函数完全匹配logger
。特别是,对于更复杂的功能,重复类型会很乏味。
关于如何在不显式重复类型注释的情况下完成此操作的任何想法?
您可以使用 typeof
:
function consumer (logFunc: typeof logger) {
logFunc('foo');
}
似乎是一个 Flow 错误,在类型位置使用表达式不会给你一个有意义的错误,但我不太熟悉它,所以它可能有其他含义。
不过,这里的错误体验相当令人困惑——使用类型别名可能会更好。当然,在这个片段中,我更希望第 15 行出现错误,而不是第 1 行和第 9 行