【发布时间】:2021-03-08 19:03:48
【问题描述】:
我正在使用 TypeScript 开发一个 React Web 应用程序。 我想使用 React Hooks 和 Context API 设置状态管理,发现这个很酷、简单且简短的 tutorial。
我按照教程进行操作,但我的编译器显示了几个错误。我认为这是基本的类型错误,我不明白(我更习惯 JavaScript 而不是 TypeScript)。
我的状态上下文:
import React, { createContext, useContext, useReducer } from 'react';
export interface IState {
isAuth: boolean;
user: string;
}
interface IContextProps {
state: IState;
dispatch: ({ type }: { type: string }) => void;
}
export const StateContext = createContext({} as IContextProps);
export const StateProvider = ({ reducer, initialState, children }) => (
<StateContext.Provider value={useReducer(reducer, initialState)}>
{children}
</StateContext.Provider>
);
export const useStateValue = () => useContext(StateContext);
我的状态减速器:
import { initialState } from './InitialState';
export const reducer = (state = initialState, action: any) => {
switch (action.type) {
case 'setObj':
return {
...state,
obj: action.objValue,
};
default:
return state;
}
};
我的初始状态:
import { emptyObj } from '../interfaces/IObj';
export const initialState = {
obj: emptyObj,
};
我的应用:
import React from 'react';
import { StateProvider } from './utils/StateContext';
import { initialState } from './globals/constants/InitialState';
import { reducer } from './globals/constants/StateReducer';
function App() {
return (
<div className='App'>
<header className='App-header'>
<StateProvider initialState={initialState} reducer={reducer}>
<p>Hello World</p>
</StateProvider>
</header>
</div>
);
}
export default App;
错误仅在状态上下文文件中:
1.) 状态上下文
第一个错误是状态上下文。在教程中它被定义为:
export const StateContext = createContext();
并且编译器会抛出一个错误。
如果我使用export const StateContext = createContext(undefined);,那么错误就消失了。
此外,如果我使用(如开头所述)export const StateContext = createContext({} as IContextProps); 并添加接口 IState 和 IContextProps 那么它也可以工作。我想那部分现在很好。
2.) 状态提供者export const StateProvider = ({ reducer, initialState, children }) => ... 编译器为 reducer、initialState 和 children 抛出相同的错误:Binding Element [reducer / initialState / children] 隐含任何类型。
3.) 值value={useReducer(reducer, initialState)}>... 编译器喊:
类型“[未知,DispatchWithoutAction]”不可分配给类型“IContextProps”.ts(2322)
index.d.ts(335, 9):预期类型来自属性“值”,该属性在此处声明为类型“IntrinsicAttributes & ProviderProps”
提前感谢您的帮助。如果您需要更多信息,请告诉我。
【问题讨论】:
-
1)
createContext函数需要一个默认值,以防有人试图在提供程序之外使用它。正如您所指出的,这可能只是未定义或空对象,但这是一项要求。 2)这是 Typescript 的一部分(可以关闭),但它告诉你它不能推断 reducer、inititalState 和 children 的类型。您将不得不更改您的代码,以便它可以推断它们或手动输入它们。 3)useReducer无法推断您的状态的类型(由未知数显示),解决此问题的方法可能是将您的初始状态键入 IState。
标签: reactjs typescript react-context