前端小白,在学redux,想看下createStore实现,发现写法有点看不懂,有好人帮忙解释下吗
以下为
//看不懂的代码块start
export interface StoreCreator {
<S, A extends Action, Ext, StateExt>(
reducer: Reducer<S, A>,
enhancer?: StoreEnhancer<Ext, StateExt>
): Store<S & StateExt, A> & Ext
<S, A extends Action, Ext, StateExt>(
reducer: Reducer<S, A>,
preloadedState?: DeepPartial<S>,
enhancer?: StoreEnhancer<Ext>
): Store<S & StateExt, A> & Ext
}
export const createStore: StoreCreator
//看不懂的代码块end
最后一句 是导出 接口类型为StoreCreator 的常量 createStore 的意思吗?
为什么我在外部调用 createStore(param),这里createStore表现的像是一个function。具体调用处代码:
import { createStore } from 'redux';
import combineReducers from './reducers';
let store = createStore(combineReducers);
export default store;
首先最后一句确实是导出createStore这个函数,其类型声明为StoreCreator.
然后说这段你没看懂的代码,首先这块属于typescript,声明了一个接口(这点如果不知道,去看看typescript).
这里声明StoreCreator是一个函数类型并有重载,这里重载的目的是在只有两个参数的情况下自动判断第二个参数是preloadedState还是enhancer, 简单来说,就是将
createStore(reducer, null, enhancer)
简化为createStore(reducer, enhancer)
.可以拆分出来两个函数声明,两个是类似的,因此就简单说下面这一个好了。
这里前面的
<S, A extends Action, Ext, StateExt>
属于泛型声明, 声明了4个泛型变量, 其中A必须继承自Action(这是一个已声明的类型,下面的Reducer, StoreEnhancer和Store都是声明好的,你应该可以在代码里找到他们的声明)。 然后就很简单了, 这个函数接受reducer和enhancer两个参数, 返回类型是Store<S & StateExt, A> & Ext
这里主要涉及到typescript的一些语法, 我这里列一下吧
这些都可以在typescript的官方文档找到,你读了之后这里就很好理解了。