首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高阶函数,流类型注解

高阶函数,流类型注解
EN

Stack Overflow用户
提问于 2016-02-17 00:00:51
回答 1查看 1.4K关注 0票数 4

我试图编写一些非常简单的功能示例来评估流类型系统。我是不是遗漏了一些显而易见的东西,或者这个样本是否有效:

代码语言:javascript
复制
function logger (message: string): void {
    console.log(message);
}

function consumer (logFunc: logger) {
    logFunc('foo');
}

consumer(logger);

当我在试流上试用它时,我会得到“原型中找不到的可调用签名”。在本地运行(流程0.21.0)时,我得到了相同的消息:

代码语言:javascript
复制
  8:     logFunc('foo');
         ^^^^^^^^^^^^^^ function call. Callable signature not found in
  8:     logFunc('foo');
         ^^^^^^^ prototype

我可以通过显式声明类型别名来解决这个问题,但这似乎是不必要的重复(特别是对于更复杂的模块):

代码语言:javascript
复制
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

假设consumerlogger是单独的模块(甚至是在单独的npm包中),并且更加复杂,而logger是导入的(es6,或commonJS)。

  • 编写两次类型(loggerloggerType)似乎不合理。
  • logger函数中重复consumer的类型签名似乎也不合理--我希望logFunc参数的类型与名为logger的函数完全匹配。特别是,对于更复杂的函数来说,重复这些类型将是乏味的。

对于如何在不显式重复类型注释的情况下实现这一点,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-17 21:52:17

您可以使用typeof

代码语言:javascript
复制
function consumer (logFunc: typeof logger) {
    logFunc('foo');
}

似乎是一个流错误,在类型位置使用表达式不会给您带来有意义的错误,但是我不太熟悉它,所以它可能意味着其他的东西。

但是,这里的错误体验非常令人困惑--使用类型别名可能会更好。当然,在这个片段中,我更希望在第15行出现错误,而不是在第1和第9行上出错。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35445393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档