@reduxjs/toolkit
Version: 
The official, opinionated, batteries-included toolset for efficient Redux development
115 lines (94 loc) • 3.19 kB
text/typescript
import { getDefaultMiddleware } from '@reduxjs/toolkit'
import type { Middleware } from 'redux'
import type { DispatchForMiddlewares } from '@internal/tsHelpers'
declare const expectType: <T>(t: T) => T
declare const middleware1: Middleware<{
  (_: string): number
}>
declare const middleware2: Middleware<{
  (_: number): string
}>
declare const getDispatch: <M extends Array<Middleware>>(
  m: M
) => DispatchForMiddlewares<M>
type ThunkReturn = Promise<'thunk'>
declare const thunkCreator: () => () => ThunkReturn
{
  const defaultMiddleware = getDefaultMiddleware()
  // prepend single element
  {
    const concatenated = defaultMiddleware.prepend(middleware1)
    const dispatch = getDispatch(concatenated)
    expectType<number>(dispatch('foo'))
    expectType<ThunkReturn>(dispatch(thunkCreator()))
    // @ts-expect-error
    expectType<string>(dispatch('foo'))
  }
  // prepepend multiple (rest)
  {
    const concatenated = defaultMiddleware.prepend(middleware1, middleware2)
    const dispatch = getDispatch(concatenated)
    expectType<number>(dispatch('foo'))
    expectType<string>(dispatch(5))
    expectType<ThunkReturn>(dispatch(thunkCreator()))
    // @ts-expect-error
    expectType<string>(dispatch('foo'))
  }
  // prepend multiple (array notation)
  {
    const concatenated = defaultMiddleware.prepend([
      middleware1,
      middleware2,
    ] as const)
    const dispatch = getDispatch(concatenated)
    expectType<number>(dispatch('foo'))
    expectType<string>(dispatch(5))
    expectType<ThunkReturn>(dispatch(thunkCreator()))
    // @ts-expect-error
    expectType<string>(dispatch('foo'))
  }
  // concat single element
  {
    const concatenated = defaultMiddleware.concat(middleware1)
    const dispatch = getDispatch(concatenated)
    expectType<number>(dispatch('foo'))
    expectType<ThunkReturn>(dispatch(thunkCreator()))
    // @ts-expect-error
    expectType<string>(dispatch('foo'))
  }
  // prepepend multiple (rest)
  {
    const concatenated = defaultMiddleware.concat(middleware1, middleware2)
    const dispatch = getDispatch(concatenated)
    expectType<number>(dispatch('foo'))
    expectType<string>(dispatch(5))
    expectType<ThunkReturn>(dispatch(thunkCreator()))
    // @ts-expect-error
    expectType<string>(dispatch('foo'))
  }
  // concat multiple (array notation)
  {
    const concatenated = defaultMiddleware.concat([
      middleware1,
      middleware2,
    ] as const)
    const dispatch = getDispatch(concatenated)
    expectType<number>(dispatch('foo'))
    expectType<string>(dispatch(5))
    expectType<ThunkReturn>(dispatch(thunkCreator()))
    // @ts-expect-error
    expectType<string>(dispatch('foo'))
  }
  // concat and prepend
  {
    const concatenated = defaultMiddleware
      .concat(middleware1)
      .prepend(middleware2)
    const dispatch = getDispatch(concatenated)
    expectType<number>(dispatch('foo'))
    expectType<string>(dispatch(5))
    expectType<ThunkReturn>(dispatch(thunkCreator()))
    // @ts-expect-error
    expectType<string>(dispatch('foo'))
  }
}