【发布时间】:2021-07-14 21:17:07
【问题描述】:
我有一个使用 useContext 的 React 应用程序,但我无法正确输入上下文。这是我所拥有的:
import React, { useState, createContext } from 'react';
import endpoints from '../components/endpoints/endpoints';
interface contextTypes {
endpointQuery: string,
setEndpointQuery: React.Dispatch<React.SetStateAction<string>>,
searchInput: string,
setSearchInput: React.Dispatch<React.SetStateAction<string>>,
filmSearch: string | undefined,
setFilmSearch: React.Dispatch<React.SetStateAction<string>>
pageIndex: number,
setPageIndex: React.Dispatch<React.SetStateAction<number>>,
resetState: () => void;
}
export const DisplayContext = createContext<Partial<contextTypes>>({});
interface Props {
children: React.ReactNode;
}
const DisplayContextProvider = (props: Props) => {
const { nowShowing } = endpoints;
const [ endpointQuery, setEndpointQuery ] = useState(nowShowing);
const [ searchInput, setSearchInput ] = useState('');
const [ filmSearch, setFilmSearch ] = useState('');
const [ pageIndex, setPageIndex ] = useState(1);
const resetState = () => {
setSearchInput('');
setFilmSearch('');
setPageIndex(1);
};
const values = {
endpointQuery,
setEndpointQuery,
pageIndex,
setPageIndex,
filmSearch,
setFilmSearch,
searchInput,
setSearchInput,
resetState
};
return (
<DisplayContext.Provider value={values}>
{props.children}
</DisplayContext.Provider>
);
};
export default DisplayContextProvider;
问题是,当我使用 <Partial<contextTypes>> 时,我的整个应用程序都会出现此错误:
Cannot invoke an object which is possibly 'undefined'
有没有办法解决这个问题,所以我不必到处添加! 标记到我得到未定义错误的所有内容? (我对 Typescript 也很陌生,所以我完全有可能以完全错误的方式输入我的上下文)
【问题讨论】:
-
createContext<contextTypes>({} as contextTypes);? -
Partial 表示缺少某些键并且不知道哪些键。所以 !需要,或者最好检查是否定义了密钥。如果不是这样,请不要使用 Partial。
-
@Adam Mann,为什么不存储一个初始状态以传递给具有相同形状(而不是 Partial)的 createContext?这样,已知形状中的每个属性都已定义。
-
@NadiaChibrikova,哇,这很管用。看起来很简单,但是
as让我很吃惊,因为我从来没有使用过那种语法。我想我需要深入研究如何使用它。 -
@AdamMann
as类似于 '!',带有 '!'你告诉 TS “我知道它不为空”,并用as- “我知道它是 X 类型,即使它看起来不像”。如果您确信上下文将在使用之前被初始化,您也可以假装它已经初始化:)
标签: reactjs typescript react-context