@reduxjs/toolkit
Version:
The official, opinionated, batteries-included toolset for efficient Redux development
94 lines (83 loc) • 2.78 kB
text/typescript
import type {
Middleware,
Dispatch as ReduxDispatch,
UnknownAction,
MiddlewareAPI,
} from 'redux'
import type { ExtractDispatchExtensions, FallbackIfUnknown } from '../tsHelpers'
import type { PayloadAction, BaseActionCreator } from '../createAction'
export type GetMiddlewareApi<MiddlewareApiConfig> = MiddlewareAPI<
GetDispatch<MiddlewareApiConfig>,
GetState<MiddlewareApiConfig>
>
export type MiddlewareApiConfig = {
state?: unknown
dispatch?: ReduxDispatch
}
// TODO: consolidate with cAT helpers?
export type GetState<MiddlewareApiConfig> = MiddlewareApiConfig extends {
state: infer State
}
? State
: unknown
export type GetDispatch<MiddlewareApiConfig> = MiddlewareApiConfig extends {
dispatch: infer Dispatch
}
? FallbackIfUnknown<Dispatch, ReduxDispatch>
: ReduxDispatch
export type AddMiddleware<
State = any,
Dispatch extends ReduxDispatch<UnknownAction> = ReduxDispatch<UnknownAction>
> = {
(...middlewares: Middleware<any, State, Dispatch>[]): void
withTypes<MiddlewareConfig extends MiddlewareApiConfig>(): AddMiddleware<
GetState<MiddlewareConfig>,
GetDispatch<MiddlewareConfig>
>
}
export interface WithMiddleware<
State = any,
Dispatch extends ReduxDispatch<UnknownAction> = ReduxDispatch<UnknownAction>
> extends BaseActionCreator<
Middleware<any, State, Dispatch>[],
'dynamicMiddleware/add',
{ instanceId: string }
> {
<Middlewares extends Middleware<any, State, Dispatch>[]>(
...middlewares: Middlewares
): PayloadAction<Middlewares, 'dynamicMiddleware/add', { instanceId: string }>
withTypes<MiddlewareConfig extends MiddlewareApiConfig>(): WithMiddleware<
GetState<MiddlewareConfig>,
GetDispatch<MiddlewareConfig>
>
}
export interface DynamicDispatch {
// return a version of dispatch that knows about middleware
<Middlewares extends Middleware<any>[]>(
action: PayloadAction<Middlewares, 'dynamicMiddleware/add'>
): ExtractDispatchExtensions<Middlewares> & this
}
export type MiddlewareEntry<
State = unknown,
Dispatch extends ReduxDispatch<UnknownAction> = ReduxDispatch<UnknownAction>
> = {
id: string
middleware: Middleware<any, State, Dispatch>
applied: Map<
MiddlewareAPI<Dispatch, State>,
ReturnType<Middleware<any, State, Dispatch>>
>
}
export type DynamicMiddleware<
State = unknown,
Dispatch extends ReduxDispatch<UnknownAction> = ReduxDispatch<UnknownAction>
> = Middleware<DynamicDispatch, State, Dispatch>
export type DynamicMiddlewareInstance<
State = unknown,
Dispatch extends ReduxDispatch<UnknownAction> = ReduxDispatch<UnknownAction>
> = {
middleware: DynamicMiddleware<State, Dispatch>
addMiddleware: AddMiddleware<State, Dispatch>
withMiddleware: WithMiddleware<State, Dispatch>
instanceId: string
}