Javascript 流创建自定义承诺类型
在我的应用程序中,我试图将流类型添加到sail的水线orm中 为此,我尝试添加一个新类_delferredpromise,它是一个表或promise,因为它使用promise.all和wait,但是它添加了一些额外的函数来允许链接数据库查询。ORM上表的典型签名为:Javascript 流创建自定义承诺类型,javascript,promise,flowtype,Javascript,Promise,Flowtype,在我的应用程序中,我试图将流类型添加到sail的水线orm中 为此,我尝试添加一个新类_delferredpromise,它是一个表或promise,因为它使用promise.all和wait,但是它添加了一些额外的函数来允许链接数据库查询。ORM上表的典型签名为: type DatabaseORMTy<T> = { find: (number | {+[string]: mixed}) => _DeferredPromiseTy<$Array<T>>
type DatabaseORMTy<T> = {
find: (number | {+[string]: mixed}) => _DeferredPromiseTy<$Array<T>>,
//...
}
出现以下错误:
Error: Cannot call await with `find(...)` bound to `p` because `_DeferredPromiseTy` [1] is incompatible with `Promise` [2].
如何使自定义类型与Promise兼容
例如,在try Flow中,我注意到错误消息与此处不同:
Flow为Promise提供了特殊处理,目前不允许您将Wait与自定义TheEnables一起使用。然而,您可以扩展承诺,并且流允许您使用子类的实例作为承诺
您有两个选择:
您可以使用declare类,这使Flow认为存在该类型的类。这里的缺点是,Flow将允许您执行诸如x instanceof_DeliveredPromisety之类的操作,或者尝试构建它,即使实际上没有这样的类
declare class _DeferredPromiseTy<T> extends Promise<T> {
fetch: () => _DeferredPromiseTy<T>,
limit: (string|number) => _DeferredPromiseTy<T>,
select: (?$ReadOnlyArray<string>) => _DeferredPromiseTy<T>,
skip: (number) => _DeferredPromiseTy<T>,
sort: (string) => _DeferredPromiseTy<T>,
//and more
};
为了解决这个问题,您实际上可以定义这样一个类。这里的缺点是,如果您只是尝试将类型添加到现有的代码库中,那么它的结构可能不适合这种情况:
class _DeferredPromiseTy<T> extends Promise<T> {
fetch(): _DeferredPromiseTy<T> { return this; }
limit(x: string|number): _DeferredPromiseTy<T> { return this; }
//and more
};
您能制作一个可复制的版本吗?似乎有效。@loganfsmyth我已经更新了示例,问题只发生在分配返回的类型上,它不会使等待崩溃。我很难接受这个答案,因为第三方库的类型,所以添加类的缺点是真实的,也是不可能的。但到目前为止,这似乎是唯一的选择。
declare class _DeferredPromiseTy<T> extends Promise<T> {
fetch: () => _DeferredPromiseTy<T>,
limit: (string|number) => _DeferredPromiseTy<T>,
select: (?$ReadOnlyArray<string>) => _DeferredPromiseTy<T>,
skip: (number) => _DeferredPromiseTy<T>,
sort: (string) => _DeferredPromiseTy<T>,
//and more
};
class _DeferredPromiseTy<T> extends Promise<T> {
fetch(): _DeferredPromiseTy<T> { return this; }
limit(x: string|number): _DeferredPromiseTy<T> { return this; }
//and more
};