export interface GetState { (): S; } export interface Reducer { (state: S): S; } export interface Dispatch { (reducer: Reducer): S; } export interface Listener { (): void; } export interface Unsubscribe { (): void; } export interface Middleware { (store: Store): { (next: Dispatch): { (reducer: Reducer): any; }; }; } export interface Store { getState: GetState; dispatch: Dispatch; subscribe(listener: Listener): Unsubscribe; addMiddleware(...middlewares: Middleware[]): this; }