EmptyObject

顾名思义:是表示一个空对象类型。但是有一点点区别就是可以有或者没有一个unique symbol属性名的undefined属性。

  1. declare const $CombinedState: unique symbol
  2. interface EmptyObject {
  3. readonly [$CombinedState]?: undefined
  4. }

以下的对象可以赋值给它。

  1. const a: EmptyObject = {
  2. [Symbol('')]: undefined
  3. }
  1. const a: EmptyObject = {}

CombinedState

以下是类型定义:

  1. export type CombinedState<S> = EmptyObject & S

这是表示用combineReducers执行返回的reducer执行后的返回值。如下:

  1. export function combineReducers<S, A extends Action = AnyAction>(
  2. reducers: ReducersMapObject<S, A>
  3. ): Reducer<CombinedState<S>, A>

CombinedState类型是EmptyObject与泛型S的交叉类型。所以,

  1. CombinedState类型一定是EmptyObject类型。
  2. EmptyObject类型不一定是CombinedState类型。
  • CombinedState可以被如下对象赋值。 ```typescript const b: CombinedState<{ a: 1 }> = { a: 1,

}

  1. ```typescript
  2. const c: CombinedState<{ a: 1 }> = {
  3. a: 1
  4. }

其他的对象不能赋值给CombinedState<T>。因为类型就不会匹配。

匹配CombinedState但是不匹配EmptyObject的对象

  1. const b: EmptyObject = {
  2. a: 1,
  3. [Symbol('')]: undefined
  4. }

也就是除了[Symbol('')]: undefined属性的空对象都不能赋值给EmptyObject,其余的则实现Combinedstate的泛型类型就可以了。

产生CombinedState的原因

想要区分当前的State是通过combineReducersreducer产生的,还是通过普通的reducer产生的。

  • 普通的reducer产生的State,就是State类型。
  • combineReducers返回的reducer产生的State,是CombinedState类型。
    • 从类型上,CombinedState是包含State类型的。他们可以互相赋值。
    • 从结构上看,CombinedState是不同与State类型的。我们可以编写代码的时候,进行区分,会有相应的提示。
      • image.png
      • image.png