Javascript StoreEnhancer的TypeScript定义阻止rest参数
我正在使用React Redux设置一个应用程序,并配置了商店,类似于所示的指南 这是我的密码: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
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
。它有多个{}
作为类型参数,但它是单一类型。