Ошибка с расширением Redux DevTools с использованием TS: свойство «__REDUX_DEVTOOLS_EXTENSION_COMPOSE__» не существует для типа «Window».?

Я получаю эту ошибку в своем index.tsx.

Свойство REDUX_DEVTOOLS_EXTENSION_COMPOSE не существует для типа Window.

Вот мой код index.tsx:

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import App from './App';
import './index.css';
import registerServiceWorker from './registerServiceWorker';

import { Provider } from 'react-redux';

import { createStore, compose, applyMiddleware } from 'redux';
import rootReducer from './store/reducers';

import thunk from 'redux-thunk';

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

 const store = createStore(rootReducer, composeEnhancers(
     applyMiddleware(thunk)
 ));

ReactDOM.render(  <Provider store={store}><App /></Provider>, document.getElementById('root'));

registerServiceWorker();

Я установил @ types / npm install --save-dev redux-devtools-extension и использую create-response-app-typescript. Большое спасибо за любые советы о том, что происходит заранее.


person justkeithcarr    schedule 14.10.2018    source источник


Ответы (9)


Вот как вы можете использовать redux-dev-tools в приложении для реагирования на машинописный текст.

Создайте глобальный интерфейс для объекта Window:

declare global {
  interface Window {
    __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
  }
}

Затем создайте composeEnhancers следующим образом:

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

Затем создайте store.

const store = createStore(rootReducers, composeEnhancers());

rootReducers - в моем случае относится к combinedReducers, созданному в отдельном файле.

Теперь вы можете использовать Provider как обычно в React.js как:

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);

Весь код в index.tsx

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import rootReducers from "./reducers";

import { Provider } from "react-redux";
import { createStore, compose, applyMiddleware } from "redux";

declare global {
  interface Window {
    __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
  }
}

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(rootReducers, composeEnhancers());

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);
reportWebVitals();

person Crispen Gari    schedule 01.07.2021

Это частный случай этого вопроса. Redux не предоставляет типы для __REDUX_DEVTOOLS_EXTENSION_COMPOSE__, потому что эта функция предоставляется Redux DevTools, а не самим Redux.

Это либо:

const composeEnhancers = window['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__'] as typeof compose || compose;

Or:

declare global {
    interface Window {
      __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
    }
}

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

Это уже сделано пакетом redux-devtools-extension, который содержит типизацию TypeScript. Если он установлен, его импорт следует использовать вместо доступа к __REDUX_DEVTOOLS_EXTENSION_COMPOSE__ вручную.

person Estus Flask    schedule 14.10.2018
comment
Большое спасибо за этот @etus, ты радость жизни !! - person justkeithcarr; 15.10.2018
comment
Рад, что помог. - person Estus Flask; 15.10.2018
comment
Используя window['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__'], я получаю сообщение об ошибке, говорящее, что окно использует числовой индекс, пока мы устанавливаем строку ... - person Peppe; 24.08.2019
comment
@Peppe Проблема, скорее всего, связана с вашей настройкой, старой версией TS или испорченными типами. Вы можете попробовать (window as any)['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__'] как грязное исправление. В любом случае, redux-devtools-extension - хороший способ решить эту проблему. - person Estus Flask; 24.08.2019

Мой подход к этому вопросу был следующим:

export const composeEnhancers =
  (window && (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;
person Austris Cirulnieks    schedule 14.04.2019
comment
Но что, если вы не можете использовать any как тип? - person pmiranda; 15.02.2021

Самый простой способ сделать эту работу с TypeScript - использовать redux-devtools-extension и установите как зависимость dev следующим образом:

npm install --save-dev redux-devtools-extension

Следующий шаг для новичков в redux и этих инструментах разработчика был запутанным и непонятным. Все документы содержат следующий код:

const store = createStore(reducer, composeWithDevTools(
  applyMiddleware(...middleware),
  // other store enhancers if any
));

Проблема в том, что у меня нет настроенного промежуточного программного обеспечения, поэтому это не сработало. В самом примитивном использовании это все, что вам нужно:

import { composeWithDevTools } from 'redux-devtools-extension';

const store = createStore(myReducer, composeWithDevTools());

На этом этапе, если вы щелкнете по расширению в браузере и есть допустимое хранилище redux, вы сможете проверить состояние.

Это альтернативный подход к использованию (window as any), а также проясняет только то, как использовать redux-devtools-extension в его минимальной форме.

person atconway    schedule 05.09.2019
comment
Я думаю, что это решение с использованием redux-devtools-extension от npm является более чистым. Я его использовал и отлично работает. - person Federico Viotti; 27.09.2020
comment
Не для того, чтобы добавить шума, но это выглядит намного правильнее и должно быть принято в качестве ответа (тем более, что OP не указал, что они не могут импортировать composeWithDevTools по какой-либо причине). И нам не нужно добавлять больше as any! - person Baggio Wong; 19.11.2020

Работает как оберег:

const store = createStore(
    rootReducer,
    initialState,
    compose(
        applyMiddleware(...middleware),
        (window as any).__REDUX_DEVTOOLS_EXTENSION__ && (window as any).__REDUX_DEVTOOLS_EXTENSION__()
    )       

);
person Arturas    schedule 10.08.2019

если кто-то все еще застрял в этой проблеме, я исправил ее, и это мой последний файл store.js со следующими пакетами 1 - Redux Thunk 2 - Connected React Router 3 - История

import { createStore, applyMiddleware, compose } from 'redux';
import { routerMiddleware } from 'connected-react-router';
import thunk from 'redux-thunk';
import {createBrowserHistory} from 'history';
import rootReducer from '../redux/reducers';
export const history = createBrowserHistory();
const initialState = {}
const enhancers = []
const middleware = [
    thunk,
    routerMiddleware(history)
]

if (process.env.NODE_ENV === 'development') {
    const devToolsExtension = (window as any).__REDUX_DEVTOOLS_EXTENSION__ && (window as any).__REDUX_DEVTOOLS_EXTENSION__() || compose;
    if (typeof devToolsExtension === 'function') {
        enhancers.push(devToolsExtension)
    }
}

const composedEnhancers = compose(
    applyMiddleware(...middleware),
    ...enhancers
);

export default createStore(
    rootReducer,
    initialState,
    composedEnhancers
);
person Danial    schedule 23.01.2020

Если бы такая же проблема изменилась, я только что изменил

window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()

to

window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__() || compose

чтобы обойти undefined проблему с применением при использовании createStore(reducer, initial state, compose(applyMiddleware

person mmunier44    schedule 19.12.2018

Для тех, кто борется с одновременной работой, общий совет, который я нашел, - заменить ваш "клиентский" скрипт в package.json на: "client": "cd client && npm start",

Я пробовал это, но все равно получаю ошибку, поэтому я попробовал: "client": "cd client && cd my-app && npm start",

Это сработало для меня! Проблема в том, что когда вы используете приложение create-response-app внутри «клиентской» папки, между клиентской папкой и общими папками и папками src есть дополнительный уровень, который по умолчанию называется «my-app». Используя код Брэда, npm пропускает эту папку, поэтому не может найти файлы реакции, необходимые для запуска вашего приложения.

person Ghausc1    schedule 05.05.2020

В моем случае я использовал react-redux-devtools. Попробуйте это решение, возможно, оно поможет вам решить вашу проблему.

import { applyMiddleware, createStore } from "redux";
import { composeWithDevTools } from "redux-devtools-extension";
import createSagaMiddleware from "redux-saga";
import { rootReducer } from "../reducers";
import { AppState } from "@eneto/api-client";

import { initUserState } from "../../modules/users/user-reducer";
import { initUsersState } from "../../modules/users/users-reducer";
import { initListsState } from "../../modules/lists/lists-reducer";
import { initListState } from "../../modules/lists/list-reducer";

// initialValues
const init: AppState = {
    currentUser: initUserState,
    users: initUsersState,
    lists: initListsState,
    currentList: initListState
};

export function store(initialState: AppState = init) {
    const sagaMiddleware = createSagaMiddleware();
    const middleware = [sagaMiddleware];

    return {
        ...createStore(rootReducer, initialState, composeWithDevTools(applyMiddleware(...middleware))),
        runSaga: sagaMiddleware.run
    };
}

#reactjs

person Otabek Butcher    schedule 01.05.2021