From 448aa67d2a11e7d45cd7b4492b9f599b498cb39e Mon Sep 17 00:00:00 2001 From: Jerry Francois Date: Tue, 5 Mar 2024 17:32:11 -0800 Subject: [PATCH] Fix Flow Types in RelayObservable Summary: : Leveraging latest Flow features fix the `isObservable` and `isPromise` functions to now work correctly. This allows us to finally fix `ObservableFromValue` so that it can use `Subscribable` instead of `RelayObservable`. Reviewed By: captbaritone Differential Revision: D54539298 fbshipit-source-id: bff95e07e2ac75c460e38c6d62df3eb490c5d067 --- packages/relay-runtime/network/RelayObservable.js | 12 ++++-------- packages/relay-runtime/util/isPromise.js | 7 +++---- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/relay-runtime/network/RelayObservable.js b/packages/relay-runtime/network/RelayObservable.js index 1653da283cebd..6d5a11547a320 100644 --- a/packages/relay-runtime/network/RelayObservable.js +++ b/packages/relay-runtime/network/RelayObservable.js @@ -71,9 +71,7 @@ export interface Subscribable<+T> { subscribe(observer: Observer | Sink): Subscription; } -// Note: This should accept Subscribable instead of RelayObservable, -// however Flow cannot yet distinguish it from T. -export type ObservableFromValue<+T> = RelayObservable | Promise | T; +export type ObservableFromValue<+T> = Subscribable | Promise | T; let hostReportError: | ((Error, isUncaughtThrownError: boolean) => mixed) @@ -144,9 +142,9 @@ class RelayObservable<+T> implements Subscribable { * useful for accepting the result of a user-provided FetchFunction. */ static from(obj: ObservableFromValue): RelayObservable { - return isObservable(obj) + return isObservable(obj) ? fromObservable(obj) - : isPromise(obj) + : isPromise(obj) ? fromPromise(obj) : fromValue(obj); } @@ -447,9 +445,7 @@ class RelayObservable<+T> implements Subscribable { } // Use declarations to teach Flow how to check isObservable. -// $FlowFixMe[deprecated-type] -declare function isObservable(p: mixed): boolean %checks(p instanceof - RelayObservable); +declare function isObservable(obj: mixed): obj is Subscribable; function isObservable(obj: mixed) { return ( diff --git a/packages/relay-runtime/util/isPromise.js b/packages/relay-runtime/util/isPromise.js index 88d3dcc33d163..1d14833860d07 100644 --- a/packages/relay-runtime/util/isPromise.js +++ b/packages/relay-runtime/util/isPromise.js @@ -11,11 +11,10 @@ 'use strict'; -// $FlowFixMe[deprecated-type] -declare function isPromise(p: mixed): boolean %checks(p instanceof Promise); +declare function isPromise(p: mixed): p is Promise; -function isPromise(p: $FlowFixMe): boolean { - return !!p && typeof p.then === 'function'; +function isPromise(p: mixed) { + return p != null && typeof p === 'object' && typeof p.then === 'function'; } module.exports = isPromise;