【发布时间】:2021-04-26 10:05:42
【问题描述】:
我正在尝试使用contextApi 和钩子来实现类似于 redux 的行为,但我在使用 typescript 时遇到了一些问题。
我想提供我的应用程序的状态和调度,以便能够从组件内访问和修改存储。问题是,当我使用 createContext 时,我手边仍然没有 state 和 dispatch 对象,因为我只能在 React 组件内调用 useReducer。因此,我只能调用 createContext 声明参数的类型为 any ,以便在此时传递 null 并稍后传递另一个调度和状态。
import React, { createContext, useReducer } from 'react';
import reducerAuth, { initialState } from './reducerAuth';
const ContextAuth = createContext<any>(null);
const StateProvider = (
{ children }:{children:JSX.Element},
) => {
const { Provider } = ContextAuth;
const [state, dispatch] = useReducer(reducerAuth, initialState);
return (<Provider value={{ state, dispatch }}>{children}</Provider>);
};
export { ContextAuth, StateProvider };
有没有一种方法可以让我通过 state 和 dispatch 而不必声明类型 any 并且不会发生打字稿冲突?
我不想使用redux 来实现这一切,因为我想使用原生工具,但 redux 似乎更容易,尽管非常相似。
我绑定了对象{state,dispatch}的类型来创建上下文,方法如下:
const [state, dispatch] = useReducer(reducerAuth, initialState);
type UseReducer = {
state: typeof state,
dispatch: typeof dispatch,
}
const ContextAuth = createContext<UseReducer | null>(null);
但在这种情况下,我不再能够导出 Context Auth,因为它是在 StateProvider 函数中创建的。
【问题讨论】:
-
您可能在某处有一个类型/接口来定义状态对象,对吧?只需在创建上下文时使用它:
const ContextAuth = createContext<MyStateType>(undefined); -
我编辑了这个问题来解释我在尝试这个时遇到的问题。
标签: typescript react-hooks typescript-typings context-api