reactjs - Children ელემენტის ტიპს აკლია თვისებები Nextjs + React Context TypeScript-თან


Nextjs და TypeScript-ის გამოყენებით React-ის Context-ის გამოყენება აჩვენებს ბუნდოვან შეცდომას, როდესაც კონტექსტი ტარდება _app.tsx-ის გარშემო.

თუმცა, მიუხედავად იმისა, რომ მე ვპარებით მნიშვნელობებს Context Provider-ში, მას მაძლევს შეცდომას:

"ტიპს '{ children: Element; }' აკლია შემდეგი თვისებები ტიპიდან 'ContextProps': capturedPokemons, catchPokemon, releasePokemon"

აქ არის ჩემი _app.tsx

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <CaughtProvider>
      <Component {...pageProps} />
    </CaughtProvider>
  );
}

აქ არის კონტექსტი:

type PokemonProps = {
  number: string;
  name: string;
  image: string;
};

type ContextProps = {
  capturedPokemons: PokemonProps[];
  catchPokemon: (newPokemon: PokemonProps[]) => void;
  releasePokemon: (id: string) => void;
};

const CaughtContext = createContext<ContextProps>({
  capturedPokemons: [],
  catchPokemon: () => undefined,
  releasePokemon: () => undefined,
});

export const useCaught = () => useContext(CaughtContext);

export const CaughtProvider: React.FC<ContextProps> = ({ children }) => {
  const [capturedPokemons, setCapturedPokemons] = useState<any>([]);

  const catchPokemon = (newPokemon: PokemonProps[]) => {
    if (capturedPokemons.length >= 6) {
      alert('You cannot carry any more Pokemon.');
      return;
    }

    const alreadyCaptured = capturedPokemons.some(
      (p: PokemonProps) => p.name === newPokemon[0].name
    );

    if (alreadyCaptured) {
      alert('you already have that pokemon');
      return;
    }

    if (window.confirm('Capture Pokemon')) {
      setCapturedPokemons([...capturedPokemons, ...newPokemon]);
    }
  };

  return (
    <CaughtContext.Provider
      value={{ catchPokemon, capturedPokemons, releasePokemon }}>
      {children}
    </CaughtContext.Provider>
  );
};

აპლიკაცია კარგად მუშაობს, როგორც მოსალოდნელი იყო, და რაც ჩემთვის ცნობილია, ეს Plain React/JS-ში არასაიტიპო TypeScript-ის გარეშე ასე ხორციელდება.

პასუხი #1

თქვენ უნდა გქონდეთ ცალკე ტიპი CaughtProvider-ისთვის

type CaughtProviderProps = {
children: React.ReactNode
}

და გამოიყენეთ როგორც

CaughtProvider: React.FC<CaughtProviderProps>

ContextProps არის შენი context value-ისთვის, ამიტომ არ არის სწორი მისი გამოყენება CaughtProvider-ისთვის. CaughtProvider უბრალოდ კომპონენტია, რომელიც იღებს children პროპს. ამიტომ უკეთესი იქნება მისთვის სპეციალური ტიპის განსაზღვრა.