Improve type robustness for TrackedAsyncData<T>
#2
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Export a union type as the actual public API of
TrackedAsyncData<T>
, along with aconst
-bound export of the class (with a safe cast for the constructor). The union is implemented as a union of interfaces which extend the base class so that (a) they are guaranteed to be structurally compatible and (b) docstrings continue to "just work".The upshot of this change: All existing invocations continue to work exactly as they have up to this point, but the type now correctly narrows when checking any of the boolean properties exposed to indicate the state of the type. For example, given a
TrackedAsyncData<string>
, the.value
and.error
properties will have the typenull
when.isPending
istrue
;.value
will have the typestring
when.isResolved
istrue
but.error
will still benull
, etc.Thanks to @dfreeman for suggesting a variant on this approach!