Flowtype:动态扩展类

Jim*_*ini 6 javascript flowtype

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

我的具体用例是蓝鸟promisifyAll():

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

显然,流量无法自动解决这个问题.所以,我愿意帮助它.问题是如何?

请考虑以下代码

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')
})
Run Code Online (Sandbox Code Playgroud)

Flow在此处给出以下错误:

property `listenAsync`. Property not found in
Server
Run Code Online (Sandbox Code Playgroud)

如果我使用的话不会有任何错误listen.flow非常聪明,可以看出这是模块中定义的真实方法.但是流动listenAsync的动态增加promisifyAll是不可见的

vku*_*kin 7

这是不可能的,这样做不太安全.您可以为您的案例做些什么:

首先声明bluebird如下:

declare module "bluebird" {
  declare function promisifyAll(arg: any): any
}
Run Code Online (Sandbox Code Playgroud)

然后这样做:

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)
Run Code Online (Sandbox Code Playgroud)

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