Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Property 'setCurrentUser' does not exist on type 'Object'.ts(2339) with useContext

I was trying to pass useState properties through Context.Provider value={{theme, setTheme}} as it was written in tutorial, and after receive it with useContext(Context), but it keeps returning me an error:

const setCurrentUser: any
Property 'setCurrentUser' does not exist on type 'Object'.ts(2339)

Note: This code is fully copied from react docs with little type additions to see if it’s me how’s making such mistake, or I just don’t know how to fix it

I checked usage useContext with TypeScript, but code there is the same as mine and doesn’t provide me an answer

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Full code:

import { createContext, useContext, useState, ReactNode, DetailedHTMLProps, ButtonHTMLAttributes, MouseEventHandler } from 'react';

const CurrentUserContext = createContext<Object>({});

export default function MyApp() {
      const [currentUser, setCurrentUser] = useState(null);
      return (
            <CurrentUserContext.Provider
                  value={{
                        currentUser,
                        setCurrentUser
                  }}
            >
                  <Form />
            </CurrentUserContext.Provider>
      );
}

function Form(): JSX.Element {
      return (
            <Panel title="Welcome">
                  <LoginButton />
            </Panel>
      );
}

function LoginButton(): JSX.Element {
      const {
         //\/\/\/\/\/\/\/\/
         // Error occurs here   

            currentUser,
            setCurrentUser

         ///\/\/\/\/\/\/\/\
      } = useContext(CurrentUserContext);

      if (currentUser !== null) {
            return <p>You logged in as {currentUser.name}.</p>;
      }

      return (
            <Button onClick={() => {
                  setCurrentUser({ name: 'Advika' })
            }}>Log in as Advika</Button>
      );
}

interface PanelProps {
      title: string
      children: ReactNode
}

function Panel({ title, children }: PanelProps): JSX.Element {
      return (
            <section className="panel">
                  <h1>{title}</h1>
                  {children}
            </section>
      )
}

interface ButtonProps extends DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement> {
      children: ReactNode
      onClick?: MouseEventHandler<HTMLButtonElement>
}

function Button({ children, onClick }: ButtonProps): JSX.Element {
      return (
            <button className="button" onClick={onClick}>
                  {children}
            </button>
      );
}

If this wording of the question is not correct, please let me know

>Solution :

The type of CurrentUserContext is set to Object (L#3), where it’s supposed to be explicit object structures (or any)

Take a look at the TS docs on object types

createContext<{
    currentUser: string, 
    setCurrentUser: fn(_:any) => void 
}>

Should be the approximate type you’re looking for. I have no way to tell for sure.

But this gets messy, so consider instantiating as suggested by H294. Or using a type alias

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading