首页 > 解决方案 > StoreEnhancer 的 TypeScript 定义阻止了剩余参数

问题描述

我正在使用 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;

}

但是,当我运行 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>

如果是这样,即使我在配置文件中将“noImplicitAny”属性设置为“true”,为什么它不接受其余参数中的“Any”类型,如下所示?

(据我所知,其余参数无论如何都无法接收声明的类型。)

我错过了什么?



另外,我正在使用以下软件包版本:

“反应”:“^16.4.2”,
“redux”:“^4.0.0”,
“redux-thunk”:“^2.3.0”,
“webpack”:“^4.16.5”,
“真棒打字稿” -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": true,
* "noImplicitAny": true,
* "module": "esnext",
* "target": "esnext",
* "jsx": "react",
* "moduleResolution": "node",
* "noUnusedLocals": true,
* "noUnusedParameters": true,
* "strict": true,
* "esModuleInterop": false,
* "noFallthroughCasesInSwitch":真,
*“allowSyntheticDefaultImports”:真
}

标签: javascriptreactjstypescriptredux

解决方案


问题是返回类型composedEnhancers{},而createStore期望它是StoreEnhancerStoreCreator<{}, {}>。并且返回类型{}来自您对 的调用,这与类型声明compose中的此重载相匹配,因为您正在传播增强器数组:

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

如果不指定R,则默认为{}。因此,除非您确实需要动态增强器数组,否则请指定R或仅使用。compose(middlewareEnhancer)


推荐阅读