StoreEnhancer 的 TypeScript 定义阻止了剩余参数

Posted

技术标签:

【中文标题】StoreEnhancer 的 TypeScript 定义阻止了剩余参数【英文标题】:TypeScript definition for StoreEnhancer prevents rest parameters 【发布时间】:2019-02-07 13:03:45 【问题描述】:

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

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

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

我错过了什么? 另外,我正在使用以下软件包版本:

“反应”:“^16.4.2”, "redux": "^4.0.0", "redux-thunk": "^2.3.0", "webpack": "^4.16.5", “很棒的打字稿加载器”:“^5.2.0”, “打字稿”:“^3.0.3” "@types/react": "^16.4.12", "@types/redux": "^3.6.0", "@types/redux-thunk": "^2.1.0"

使用以下 TS 配置设置:

“编译器选项”: * "outDir": "./dist/", *“源地图”:是的, *“noImplicitAny”:是的, *“模块”:“esnext”, *“目标”:“esnext”, *“jsx”:“反应”, * "moduleResolution": "节点", *“noUnusedLocals”:是的, * "noUnusedParameters": true, *“严格”:真, *“esModuleInterop”:假, * "noFallthroughCasesInSwitch": true, * "allowSyntheticDefaultImports": true

【问题讨论】:

【参考方案1】:

问题是composedEnhancers 的返回类型是,而createStore 期望它是StoreEnhancerStoreCreator&lt;, &gt; 的返回类型来自您对 compose 的调用,这与 type declarations 中的此重载相匹配,因为您正在传播一系列增强器:

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

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

【讨论】:

谢谢。它使,我想。所以基本上,如果我使用 rest 参数来表示一个参数,它会导致 compose 中的泛型 默认为恰好一种 类型,而扩展语法强制 createStore 期望不止一种 类型来自compose? 如果将单个展开参数传递给compose,则组合函数的返回类型默认为,而不管展开参数中的实际元素数量如何。 不匹配 StoreEnhancerStoreCreator&lt;Ext, StateExt&gt;,这是作为第三个参数传递给 createStore 的函数的预期返回类型。 createStore 没有传播。 抱歉,我应该说 ...多个 类型是 compose 的结果,而不是 ...from compose。尽管如此,这两种选择都奏效了。谢谢。 FWIW,我仍然不明白您所说的“多个 类型”指的是什么。预期类型为StoreEnhancerStoreCreator&lt;, &gt;。它有多个 作为类型参数,但它是单一类型。

以上是关于StoreEnhancer 的 TypeScript 定义阻止了剩余参数的主要内容,如果未能解决你的问题,请参考以下文章

typeScrip泛型

Springboot + mybatis + React+redux+React-router+antd+Typescript: React+Typescrip项目的搭建

Electron Forge使用

一篇缺失的 TypeScript 介绍

vuejs,angularjs,reactjs介绍

Sequelize-typescript 'HasManyCreateAssociationMixin' 不是函数