createContext 不接受defaultValue

Pet*_*sma 10 typescript reactjs

createContext我正在尝试使用React API来构建上下文:

import React, { useState, createContext } from 'react';

export const MovieContext =  createContext();

export const MovieProvider = (props) => {
  const [movies, setMovies] = useState(
    [
      {
        original_title: 'name of movie',
        poster_path: 'path_to_poster',
        id: 1
      }
    ]
  );
  return (
    <MovieContext.Provider value={[movies, setMovies]}>
      {props.children}
    </MovieContext.Provider>
  );
}

export default MovieProvider;
Run Code Online (Sandbox Code Playgroud)

createContext()函数显示此错误:

预期有 1 个参数,但得到 0.ts(2554) index.d.ts(385, 9):未提供“defaultValue”的参数。

如果我将其设为字符串,并传递一个字符串作为应用程序构建的值:

export const MovieContext =  createContext('');

<MovieContext.Provider value={''}>
  {props.children}
</MovieContext.Provider>
Run Code Online (Sandbox Code Playgroud)

我应该添加什么样的值作为createContext()参数才能使其与 useState 挂钩一起使用?我正在遵循这个人的教程,他是用 JS 做的,但我正在 TS 中构建我的应用程序,所以它更严格一点。

Nik*_*eev 16

这些是 Typescript 类型,它们在此处进行了描述。代码中有一条注释为什么需要这个参数,尽管文档没有说它是必需的。

function createContext<T>(
    // If you thought this should be optional, see
    // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/24509#issuecomment-382213106
    defaultValue: T,
): Context<T>;
Run Code Online (Sandbox Code Playgroud)

在您的情况下,将正确设置默认参数,例如

type IMovie = {
    original_title: string;
    poster_path: string;
    id: number;
};

type IMovieContext = [IMovie[], React.Dispatch<React.SetStateAction<IMovie[]>>];

export const MovieContext = createContext<IMovieContext>([[], () => null]);

export const MovieProvider = props => {
    const [movies, setMovies] = useState<IMovie[]>([
        {
            original_title: 'name of movie',
            poster_path: 'path_to_poster',
            id: 1,
        },
    ]);
    return <MovieContext.Provider value={[movies, setMovies]}>{props.children}</MovieContext.Provider>;
};
Run Code Online (Sandbox Code Playgroud)