是否可以手动为现有类定义其他方法?
我的专用酶是蓝知更鸟的promisifyAll(),它:
通过遍历对象的属性并在对象及其原型链…上创建每个函数的异步等价物来对整个对象进行Promisifieshttp://bluebirdjs.com/docs/api/promise.promisifyall.html
显然,flow无法自动解决这个问题。所以,我愿意帮忙。问题是怎么做?
考虑以下代码
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在这里给出了以下错误:
property `listenAsync`. Property not found in
Server如果我使用listen,就不会有任何错误。flow足够聪明,可以看到这是在模块中定义的一个真正的方法。但是listenAsync是由promisifyAll动态添加的,在流中是不可见的。
发布于 2016-02-04 15:19:43
这是不可能的,这样做也不太安全。下面是一些你可以为你的案子做的事情:
首先声明bluebird如下:
declare module "bluebird" {
declare function promisifyAll(arg: any): any
}然后这样做:
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类型。
https://stackoverflow.com/questions/35156908
复制相似问题