EmptyObject
顾名思义:是表示一个空对象类型。但是有一点点区别就是可以有或者没有一个unique symbol属性名的undefined属性。
declare const $CombinedState: unique symbolinterface EmptyObject {readonly [$CombinedState]?: undefined}
以下的对象可以赋值给它。
const a: EmptyObject = {[Symbol('')]: undefined}
const a: EmptyObject = {}
CombinedState
以下是类型定义:
export type CombinedState<S> = EmptyObject & S
这是表示用combineReducers执行返回的reducer执行后的返回值。如下:
export function combineReducers<S, A extends Action = AnyAction>(reducers: ReducersMapObject<S, A>): Reducer<CombinedState<S>, A>
CombinedState类型是EmptyObject与泛型S的交叉类型。所以,
CombinedState类型一定是EmptyObject类型。EmptyObject类型不一定是CombinedState类型。
CombinedState可以被如下对象赋值。 ```typescript const b: CombinedState<{ a: 1 }> = { a: 1,
}
```typescriptconst c: CombinedState<{ a: 1 }> = {a: 1}
其他的对象不能赋值给CombinedState<T>。因为类型就不会匹配。
匹配CombinedState但是不匹配EmptyObject的对象
const b: EmptyObject = {a: 1,[Symbol('')]: undefined}
也就是除了[Symbol('')]: undefined属性的空对象都不能赋值给EmptyObject,其余的则实现Combinedstate的泛型类型就可以了。
产生CombinedState的原因
想要区分当前的State是通过combineReducers的reducer产生的,还是通过普通的reducer产生的。
- 普通的
reducer产生的State,就是State类型。 combineReducers返回的reducer产生的State,是CombinedState类型。- 从类型上,
CombinedState是包含State类型的。他们可以互相赋值。 - 从结构上看,
CombinedState是不同与State类型的。我们可以编写代码的时候,进行区分,会有相应的提示。
- 从类型上,


