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.
This change adds a protected brand to what is returned by observable, and removes it from raw. This allows tracking of what is observable by the type system.
The existing code used proxies, which are transparent: there is no way to distinguish a proxy from a non-proxy. This leads to awkward code that takes a parameter, observes that parameter, and really really hopes that parameter was observable. The alternative is to do a runtime check for obervable-ness, which has both performance and legibility implications.
I've used this a little so far and its worked well, but it may have issues with very complex types I haven't seen yet. It also does impose a requirement that observed types cannot have a property called __OBSERVABLE_NOMINAL_BRAND. This seemed an acceptable trade-off.
Future work could be to turn isObservable into a typeguard from T to Observable.