UNPKG

2.08 kBPlain TextView Raw
1import type { Reducer } from 'redux'
2import type { ActionReducerMapBuilder } from '@reduxjs/toolkit'
3import { createReducer, createAction } from '@reduxjs/toolkit'
4import { expectType } from './helpers'
5
6/*
7 * Test: createReducer() infers type of returned reducer.
8 */
9{
10 type CounterAction =
11 | { type: 'increment'; payload: number }
12 | { type: 'decrement'; payload: number }
13
14 const incrementHandler = (state: number, action: CounterAction) => state + 1
15 const decrementHandler = (state: number, action: CounterAction) => state - 1
16
17 const reducer = createReducer(0 as number, {
18 increment: incrementHandler,
19 decrement: decrementHandler,
20 })
21
22 const numberReducer: Reducer<number> = reducer
23
24 // @ts-expect-error
25 const stringReducer: Reducer<string> = reducer
26}
27
28/**
29 * Test: createReducer() state type can be specified expliclity.
30 */
31{
32 type CounterAction =
33 | { type: 'increment'; payload: number }
34 | { type: 'decrement'; payload: number }
35
36 const incrementHandler = (state: number, action: CounterAction) =>
37 state + action.payload
38
39 const decrementHandler = (state: number, action: CounterAction) =>
40 state - action.payload
41
42 createReducer<number>(0, {
43 increment: incrementHandler,
44 decrement: decrementHandler,
45 })
46
47 // @ts-expect-error
48 createReducer<string>(0, {
49 increment: incrementHandler,
50 decrement: decrementHandler,
51 })
52}
53
54/*
55 * Test: createReducer() ensures state type is mutable within a case reducer.
56 */
57{
58 const initialState: { readonly counter: number } = { counter: 0 }
59
60 createReducer(initialState, {
61 increment: (state) => {
62 state.counter += 1
63 },
64 })
65}
66
67/** Test: alternative builder callback for actionMap */
68{
69 const increment = createAction<number, 'increment'>('increment')
70
71 const reducer = createReducer(0, (builder) =>
72 expectType<ActionReducerMapBuilder<number>>(builder)
73 )
74
75 expectType<number>(reducer(0, increment(5)))
76 // @ts-expect-error
77 expectType<string>(reducer(0, increment(5)))
78}