StoreEnhancer的TypeScript定义可防止其他参数

问题描述 投票:0回答:1

我正在使用React-Redux设置应用程序并配置商店,类似于here所示的指南

这是我的代码:

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;

}

但是,当我运行build时,我一直收到以下的Typescript错误

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”, “typescript”:“^ 3.0.3” “@ types / react”:“^ 16.4.12”, “@ types / redux”:“^ 3.6.0”, “@ types / redux-thunk”:“^ 2.1.0”

使用以下TS配置设置:

“compilerOptions”:{ *“outDir”:“。/ dist /”, *“sourceMap”:是的, *“noImplicitAny”:是的, *“模块”:“esnext”, *“目标”:“esnext”, *“jsx”:“反应”, *“moduleResolution”:“node”, *“noUnusedLocals”:是的, *“noUnusedParameters”:是的, *“严格”:是的, *“esModuleInterop”:false, *“noFallthroughCasesInSwitch”:是的, *“allowSyntheticDefaultImports”:true }

javascript reactjs typescript redux
1个回答
0
投票

问题是composedEnhancers的返回类型是{},而createStore期望它是StoreEnhancerStoreCreator<{}, {}>。返回类型的{}来自你对compose的调用,它与type declarations中的这个重载相匹配,因为你正在传播一系列增强子:

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

如果您未指定R,则默认为{}。所以要么指定R,要么只使用compose(middlewareEnhancer),除非你真的需要一个动态的增强器数组。

© www.soinside.com 2019 - 2024. All rights reserved.