Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript StoreEnhancer的TypeScript定义阻止rest参数_Javascript_Reactjs_Typescript_Redux - Fatal编程技术网

Javascript StoreEnhancer的TypeScript定义阻止rest参数

Javascript StoreEnhancer的TypeScript定义阻止rest参数,javascript,reactjs,typescript,redux,Javascript,Reactjs,Typescript,Redux,我正在使用React Redux设置一个应用程序,并配置了商店,类似于所示的指南 这是我的密码: import { applyMiddleware, compose, createStore } from 'redux'; import thunkMiddleware from 'redux-thunk'; import rootReducer from '../reducers/reducers' export default function configureStore() { c

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

}
从'redux'导入{applyMiddleware,compose,createStore};
从“redux thunk”导入thunk中间件;
从“../reducers/reducers”导入rootReducer
导出默认函数configureStore(){
const middleware=[thunkMiddleware];
const middlewareEnhancer=applyMiddleware(…中间件);
常量增强子=[middlewareEnhancer];
常量复合增强子=复合(…增强子);
const preload STATE=(窗口)。\uuuu preload\u STATE\uuuuuu;
删除(窗口)。\uuuu预加载\u状态\uuuuu;
const-store=createStore(rootReducer、preforedstate、composedEnhancers);
退货店;
}
但是,在运行build时,我一直收到以下Typescript错误

TS2345: Argument of type '(...args: any[]) => {}' is not assignable to parameter of type 'StoreEnhancer<{}, {}>'.
TS2345:类型为“(…args:any[])=>{}”的参数不能分配给类型为“StoreEnhancer”的参数。
我很困惑。Redux的声明文件状态(如下所示)是否表明StoreEnhancer只是将Store和state扩展名作为空的普通对象接收

export type StoreEnhancer<Ext = {}, StateExt = {}> = (next: StoreEnhancerStoreCreator) => StoreEnhancerStoreCreator<Ext, StateExt>
导出类型StoreEnhancer=(下一步:StoreEnhancerStoreCreator)=>StoreEnhancerStoreCreator
如果是这样,为什么它不接受rest参数中的“Any”类型,即使我在配置文件中将“noImplicitAny”属性设置为“true”,如下所示

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

我错过了什么?



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

“反应”:“^16.4.2”,
“redux”:“^4.0.0”,
“redux thunk”:“^2.3.0”,
“网页包”:“^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/”,
*“sourceMap”:正确,
*“noImplicitAny”:正确,
*“模块”:“esnext”,
*“目标”:“esnext”,
*“jsx”:“反应”,
*“模块解决方案”:“节点”,
*“noUnusedLocals”:正确,
*“noUnusedParameters”:true,
*“严格”:正确,
*“esModuleInterop”:false,
*“noFallthroughCasesInSwitch”:true,
*“allowSyntheticDefaultImports”:true
}


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

export function compose<R>(...funcs: Function[]): (...args: any[]) => R;
导出函数compose(…funcs:function[]):(…args:any[])=>R;

如果不指定
R
,则默认为
{}
。因此,要么指定
R
,要么只使用
compose(middlewareEnhancer)
,除非您确实需要一个动态增强子数组。

谢谢。我想,这会让你很开心。因此,基本上,如果我使用rest参数来表示一个参数,它会导致
compose
中的泛型默认为一个
{}
类型,而扩展语法强制
createStore
compose
中预期多个
{}
类型。如果将单个扩展参数传递给
compose
,然后,组合函数的返回类型默认为
{}
,而与spread参数中的实际元素数无关。
{}
StoreEnhancerStoreCreator
不匹配,这是作为第三个参数传递给
createStore
的函数的预期返回类型。
createStore
中没有传播。对不起,我应该说…由于compose而不是…来自compose,所以有多个{}类型。尽管如此,两种选择都奏效了。谢谢。FWIW,我还是不明白你所说的“不止一种{}类型”是指什么。所需类型为
StoreEnhancerStoreCreator
。它有多个
{}
作为类型参数,但它是单一类型。