Определение TypeScript для StoreEnhancer запрещает остальные параметры - PullRequest
0 голосов
/ 02 сентября 2018

Я настраиваю приложение с React-Redux и настраиваю хранилище, как показано в руководстве здесь

Вот мой код:

import { applyMiddleware, compose, createStore } from 'redux';
import thunkMiddleware from 'redux-thunk';
import rootReducer from '../reducers/reducers'

export default function configureStore() {

  const middlewares = [thunkMiddleware];
  const middlewareEnhancer = applyMiddleware(...middlewares);

  const enhancers = [middlewareEnhancer];

  const composedEnhancers = compose(...enhancers);

  const preloadedState = (<any>window).__PRELOADED_STATE__;

  delete (<any>window).__PRELOADED_STATE__;

  const store = createStore(rootReducer, preloadedState, composedEnhancers);

  return store;

}

Однако, я продолжаю получать следующую ошибку Typescript при запуске build

TS2345: Argument of type '(...args: any[]) => {}' is not assignable to parameter of type 'StoreEnhancer<{}, {}>'.

Я в замешательстве. Разве в файле декларации Redux не указано (показано ниже), что StoreEnhancer просто получает расширения Store и State как пустые простые объекты?

export type StoreEnhancer<Ext = {}, StateExt = {}> = (next: StoreEnhancerStoreCreator) => StoreEnhancerStoreCreator<Ext, StateExt>

Если это так, почему он не принимает тип «Any» из остальных параметров, даже если для свойства «noImplicitAny» в файле конфигурации установлено значение «true», как показано ниже?

(Насколько мне известно, остальные параметры не могут получить объявленный тип в любом случае.)

Чего мне не хватает?



Также я использую следующие версии пакетов:

"реагировать": "^ 16.4.2",
"redux": "^ 4.0.0",
"redux-thunk": "^ 2.3.0",
"webpack": "^ 4.16.5",
"awesome-typescript-loader": "^ 5.2.0",
"машинопись": "^ 3.0.3"
"@ types / реагировать": "^ 16.4.12",
"@ types / redux": "^ 3.6.0",
"@ types / redux-thunk": "^ 2.1.0"

со следующими настройками конфигурации TS:

"compilerOptions": {
* "outDir": "./dist/",
* "sourceMap": правда,
* "noImplicitAny": правда,
* "модуль": "esnext",
* "target": "esnext",
* "JSX": "реагировать",
* "moduleResolution": "узел",
* "noUnusedLocals": правда,
* "noUnusedParameters": true,
* "строгий": правда,
* "esModuleInterop": false,
* "noFallthroughCasesInSwitch": правда,
* "allowSyntheticDefaultImports": верно
}

1 Ответ

0 голосов
/ 02 сентября 2018

Проблема в том, что тип возвращаемого значения composedEnhancers равен {}, в то время как createStore ожидает, что оно будет StoreEnhancerStoreCreator<{}, {}>. И этот тип возврата {} приходит из вашего вызова к compose, что соответствует этой перегрузке в объявлениях типа , поскольку вы распространяете массив расширений:

export function compose<R>(...funcs: Function[]): (...args: any[]) => R;

Если вы не укажете R, по умолчанию будет {}. Так что либо укажите R, либо просто используйте compose(middlewareEnhancer), если вам действительно не нужен динамический массив расширений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...