EmptyObject
顾名思义:是表示一个空对象类型。但是有一点点区别就是可以有或者没有一个unique symbol
属性名的undefined
属性。
declare const $CombinedState: unique symbol
interface 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,
}
```typescript
const 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
类型的。我们可以编写代码的时候,进行区分,会有相应的提示。
- 从类型上,