首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flowtype:动态扩展类

Flowtype:动态扩展类
EN

Stack Overflow用户
提问于 2016-02-02 15:02:54
回答 1查看 2K关注 0票数 6

是否可以手动为现有类定义其他方法?

我的专用酶是蓝知更鸟的promisifyAll(),它:

通过遍历对象的属性并在对象及其原型链…上创建每个函数的异步等价物来对整个对象进行Promisifieshttp://bluebirdjs.com/docs/api/promise.promisifyall.html

显然,flow无法自动解决这个问题。所以,我愿意帮忙。问题是怎么做?

考虑以下代码

代码语言:javascript
复制
import http from 'http'
import { promisifyAll } from 'bluebird'

promisifyAll(http)

const server = http.createServer(() => { console.log('request is in'); })
server.listenAsync(8080).then(() => {
  console.log('Server is ready to handle connections')
})

Flow在这里给出了以下错误:

代码语言:javascript
复制
property `listenAsync`. Property not found in
Server

如果我使用listen,就不会有任何错误。flow足够聪明,可以看到这是在模块中定义的一个真正的方法。但是listenAsync是由promisifyAll动态添加的,在流中是不可见的。

EN

回答 1

Stack Overflow用户

发布于 2016-02-04 15:19:43

这是不可能的,这样做也不太安全。下面是一些你可以为你的案子做的事情:

首先声明bluebird如下:

代码语言:javascript
复制
declare module "bluebird" {
  declare function promisifyAll(arg: any): any
}

然后这样做:

代码语言:javascript
复制
import httpNode from 'http'
import { promisifyAll } from 'bluebird'
import type { Server } from 'http'


type PromisifiedServer = Server & {
  listenAsync(port: number, hostname?: string, backlog?: number): Promise<PromisifiedServer>;
};

type PromisifiedHttp = {
  createServer(listener: Function): PromisifiedServer;
};

const http: PromisifiedHttp = promisifyAll(httpNode)

在这里,我们手动将http转换为PromisifiedHttp类型。尽管我们可以使用类型交集来扩展现有类型,但我们仍然必须手动声明所有promisifed类型。

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

https://stackoverflow.com/questions/35156908

复制
相关文章

相似问题

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