Что ж, в моем приложении я пытаюсь добавить тип потока к ватерлинии orm.
Для этого я попытался добавить новый класс "_DeferredPromise", который является thenable
(или promise
, поскольку он работает с promise.all и await), однако он добавляет несколько дополнительных функций, позволяющих объединять запросы к базе данных. Обычно подпись для таблицы в ORM будет выглядеть следующим образом:
type DatabaseORMTy<T> = {
find: (number | {+[string]: mixed}) => _DeferredPromiseTy<$Array<T>>,
//...
}
И deferredPromise:
type _DeferredPromiseTy<T> = {
...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
}
Проблема заключается в следующем: я не могу позволить потоку действовать так, как если бы он был отложен обещания - это обещания , только с несколькими дополнительными функциями. Я попытался добавить подпись обещания с $Exact<Promise>
- что заставляет поток жаловаться, что вы не можете дать точное обещание. Я попытался добавить их, используя = Promise & {...}
, и попытался выше.
Но все они показывают ошибку в использовании:
const data:T = await myTable.find(1).limit(1); //would find the entry with id=1, and at most 1 entry.
Появляется следующая ошибка:
Error: Cannot call await with `find(...)` bound to `p` because `_DeferredPromiseTy` [1] is incompatible with `Promise` [2].
Как сделать пользовательский тип совместимым с Promise
?
Например, в попытке Flow (я замечаю, что там сообщение об ошибке отличается): fiddle