Javascript 流创建自定义承诺类型

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>>

在我的应用程序中,我试图将流类型添加到sail的水线orm中

为此,我尝试添加一个新类_delferredpromise,它是一个表或promise,因为它使用promise.all和wait,但是它添加了一些额外的函数来允许链接数据库查询。ORM上表的典型签名为:

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
};