redux 未捕获的类型错误:无法读取未定义的属性(阅读'dispatch')

pxq42qpu  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(202)

我目前正在尝试使用React + Typescript + Redux,但遇到了一个问题。我正在尝试通过chrome devTools测试Redux Store设置。我知道我破坏了代码(对Typescript来说非常新),但我收到了以下错误:“未捕获的TypeError:每次测试时都无法读取undefined(阅读'dispatch')'的属性。我尝试声明一个全局窗口状态,安装redux-dev-tools,但仍然非常失败。
下面是我的store/index.tsx文件:

import {
  legacy_createStore as createStore,
  combineReducers,
  applyMiddleware,
  compose,
  StoreEnhancer,
} from "redux";
import { devToolsEnhancer } from "redux-devtools-extension";
import thunk from "redux-thunk";

const rootReducer = combineReducers({});

let enhancer;

if (process.env.NODE_ENV === "production") {
  enhancer = applyMiddleware(thunk);
} else {
  const logger = require("redux-logger").default;
  const composeEnhancers =
    (window && (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;
  enhancer = composeEnhancers(applyMiddleware(thunk, logger));
}

const configureStore = () => {
  return createStore(rootReducer, devToolsEnhancer({}));
};

export default configureStore;

和我的类型/索引。d.ts:

import { StoreEnhancer } from 'redux'

export {};

declare global {
  interface Window {
    store: {};
    __REDUX_DEVTOOLS_EXTENSION__?: () => StoreEnhancer;
  }
}

最后是我的src/index.tsx:

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";

import { Provider } from "react-redux";
import { BrowserRouter } from "react-router-dom";
import configureStore from "./store";

const store = configureStore();

if (process.env.NODE_ENV !== "production") {
  window.store = store;
};

function Root() {
  return (
    <Provider store={store}>
      <BrowserRouter>
        <App />
      </BrowserRouter>
    </Provider>
  );
}

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);

root.render(
  <React.StrictMode>
    <Root />
  </React.StrictMode>
);

我还将附上我的文件设置的屏幕截图:

而我的控制台出错了:

我愿意接受所有的建议,谢谢!

6qftjkof

6qftjkof1#

这里的第一个问题是商店设置代码使用了过时的模式和大量手写代码。今天,你 * 应该 * 使用我们的官方Redux工具包来编写你的Redux应用程序,作为其中的一部分,RTK的configureStore API。它只需要几行代码就可以完成所有相同的工作:

import { configureStore } from "@reduxjs/toolkit";

const store = configureStore({
  reducer: {
    posts: postsReducer,
    comments: commentsReducer
  }
})

这将自动组合reducer,添加Redux DevTools扩展设置,并添加thunk中间件。
有关设置指南,请参阅我们的文档:

至于你看到的具体错误信息...代码 * 看起来 * 像是会运行。我猜是你添加的process.env.NODE_ENV检查有问题,所以它没有分配window.store
RTK与TypeScript的配合使用也比传统Redux代码好得多。

相关问题