Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Suggestion: Create a context with a required value #547

Open
scastiel opened this issue Aug 8, 2024 · 1 comment
Open

Suggestion: Create a context with a required value #547

scastiel opened this issue Aug 8, 2024 · 1 comment

Comments

@scastiel
Copy link

scastiel commented Aug 8, 2024

Hi! In my company we use contexts widely, and for most of them we expect them to be mounted in the root store (if not, we want things to crash as soon as possible). This is how we define and use them:

const someContext = createContext<SomeType>()

// At initialization
someContext.setComputed(() => createSomeValue())

// In a store:
const value = someContext.get(this)
if (!value) throw new Error("Missing value")
// ...

This check helps us to guarantee that the context has a value, and makes TypeScript happy.

But it's quite verbose, and a use case we have in many places. So we created a tiny helper to create a context that must receive a value:

const createRequiredContext = <T>() => {
  const ctx = createContext<T>() as Context<T>
  ctx.setDefaultComputed(() => {
    throw new Error("Missing value for context")
  })
  return ctx
}

The code becomes a bit more concise as there is not need to check the returned value anymore:

const someContext = createRequiredContext<SomeType>()

// At initialization
someContext.setComputed(() => createSomeValue())

// In a store:
const value = someContext.get(this)
// No need to check, value is guaranteed to be defined :)

Just thought it could help other users. If such a helper could be in the lib (or even be part of the context API), it would be terrific 😉.

Thanks for all the work 👍

@xaviergonz
Copy link
Owner

Thanks for the suggestion!

I'm torn. One the one hand I see its usefulness, but on the other hand it worries me it might crash reactions such as

reaction(() => someContext.get(someNode), ...)

in unexpected ways.

For example, given the node gets detached from the root store:
a) in the case of "createContext" it will return undefined, which TS should warn about due to it being undefined in the type itself
b) with "createRequiredContext" that piece of code would throw, but nothing would warn the programmer about it, which could be kind of unexpected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants