简体   繁体   中英

How to create React Context that passes a function with Typescript

I'm trying to pass state's setter function using React Context. However, I get a Typescript error "Type 'null' is not assignable to type '(value: number) => void'." when I try to assign a default value to it.

How can I solve it? Many thanks

context.tsx

import React from "react";
import { Movie } from "./movies.service";

export const MoviesContext = React.createContext<{
    movies: Movie[];
    selectedMovie: number;
    setSelectedMovie: (value: number) => void;
  }>({
    movies: [],
    selectedMovie: 0,
    setSelectedMovie: null, // ERROR IS SHOWN HERE
  });

App.tsx

import React, { useState, useEffect } from "react";
import './App.css';
import HomePage from './components/Pages/HomePage';
import { Movie, fetchMovies } from "./services/movies.service";
import { MoviesContext } from "./services/context";
import MoviePage from './components/Pages/MoviePage';

const Router = require("react-router-dom").BrowserRouter;
const Route = require("react-router-dom").Route;
const Switch = require("react-router-dom").Switch;

function App() {
  useEffect(() => {
    fetchMovies()
      .then(setMovies)
      .catch(() => setMovies([]));
  }, []);

  const [movies, setMovies] = useState<Movie[]>([]);
  const [selectedMovie, setSelectedMovie] = useState(0);

  return (
    <MoviesContext.Provider value={{ movies, selectedMovie, setSelectedMovie }}>
      <div className="App">
        <div className="container typography-base">
          <Router>
            <Switch>
              <Route path="/movie/:movieid" >
              <MoviePage />
              </Route>
            </Switch>
          </Router>
        </div>
      </div>
    </MoviesContext.Provider>
  );
}
export default App;

Your type expects setSelectedMovie to be a function, but you're setting the default value to null . Try providing a default function implementation instead.

export const MoviesContext = React.createContext<{
    movies: Movie[];
    selectedMovie: number;
    setSelectedMovie: (value: number) => void;
  }>({
    movies: [],
    selectedMovie: 0,
    setSelectedMovie: () => {},
  });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM