Skip to content

Commit 5f5fe79

Browse files
committed
Rework mapped type to keep homogenous mapping
1 parent 7252c16 commit 5f5fe79

File tree

3 files changed

+58
-57
lines changed

3 files changed

+58
-57
lines changed

packages/toolkit/src/createSlice.ts

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { executeReducerBuilderCallback } from './mapBuilders'
2424
import type { Id, TypeGuard, UnionToIntersection } from './tsHelpers'
2525
import type { InjectConfig } from './combineSlices'
2626
import { emplace } from './utils'
27+
import { DistributiveOmit } from 'react-redux'
2728

2829
export enum ReducerType {
2930
reducer = 'reducer',
@@ -75,23 +76,23 @@ export interface SliceReducerCreators<
7576
},
7677
{
7778
actions: {
78-
[ReducerName in keyof CaseReducers as CaseReducers[ReducerName] extends CaseReducer<
79+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends CaseReducer<
7980
State,
8081
any
8182
>
82-
? ReducerName
83-
: never]: ActionCreatorForCaseReducer<
84-
CaseReducers[ReducerName],
85-
SliceActionType<Name, ReducerName>
86-
>
83+
? ActionCreatorForCaseReducer<
84+
CaseReducers[ReducerName],
85+
SliceActionType<Name, ReducerName>
86+
>
87+
: never
8788
}
8889
caseReducers: {
89-
[ReducerName in keyof CaseReducers as CaseReducers[ReducerName] extends CaseReducer<
90+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends CaseReducer<
9091
State,
9192
any
9293
>
93-
? ReducerName
94-
: never]: CaseReducers[ReducerName]
94+
? CaseReducers[ReducerName]
95+
: never
9596
}
9697
}
9798
>
@@ -105,26 +106,26 @@ export interface SliceReducerCreators<
105106
) => PreparedCaseReducerDefinition<State, Prepare>,
106107
{
107108
actions: {
108-
[ReducerName in keyof CaseReducers as CaseReducers[ReducerName] extends CaseReducerWithPrepare<
109+
[ReducerName in keyof CaseReducers as ReducerName]: CaseReducers[ReducerName] extends CaseReducerWithPrepare<
109110
State,
110111
any
111112
>
112-
? ReducerName
113-
: never]: CaseReducers[ReducerName] extends { prepare: any }
114-
? ActionCreatorForCaseReducerWithPrepare<
115-
CaseReducers[ReducerName],
116-
SliceActionType<Name, ReducerName>
117-
>
113+
? CaseReducers[ReducerName] extends { prepare: any }
114+
? ActionCreatorForCaseReducerWithPrepare<
115+
CaseReducers[ReducerName],
116+
SliceActionType<Name, ReducerName>
117+
>
118+
: never
118119
: never
119120
}
120121
caseReducers: {
121-
[ReducerName in keyof CaseReducers as CaseReducers[ReducerName] extends CaseReducerWithPrepare<
122+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends CaseReducerWithPrepare<
122123
State,
123124
any
124125
>
125-
? ReducerName
126-
: never]: CaseReducers[ReducerName] extends { reducer: infer Reducer }
127-
? Reducer
126+
? CaseReducers[ReducerName] extends { reducer: infer Reducer }
127+
? Reducer
128+
: never
128129
: never
129130
}
130131
}
@@ -133,10 +134,7 @@ export interface SliceReducerCreators<
133134
AsyncThunkCreator<State>,
134135
{
135136
actions: {
136-
[ReducerName in ReducerNamesOfType<
137-
CaseReducers,
138-
ReducerType.asyncThunk
139-
>]: CaseReducers[ReducerName] extends AsyncThunkSliceReducerDefinition<
137+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends AsyncThunkSliceReducerDefinition<
140138
State,
141139
infer ThunkArg,
142140
infer Returned,
@@ -146,10 +144,7 @@ export interface SliceReducerCreators<
146144
: never
147145
}
148146
caseReducers: {
149-
[ReducerName in ReducerNamesOfType<
150-
CaseReducers,
151-
ReducerType.asyncThunk
152-
>]: CaseReducers[ReducerName] extends AsyncThunkSliceReducerDefinition<
147+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends AsyncThunkSliceReducerDefinition<
153148
State,
154149
any,
155150
any,
@@ -631,6 +626,10 @@ export type SliceActionType<
631626
ActionName extends keyof any,
632627
> = ActionName extends string | number ? `${SliceName}/${ActionName}` : string
633628

629+
type ConvertNeverKeysToUnknown<T> = T extends any
630+
? { [K in keyof T]: T[K] extends never ? unknown : T[K] }
631+
: never
632+
634633
/**
635634
* Derives the slice's `actions` property from the `reducers` options
636635
*
@@ -642,11 +641,13 @@ export type CaseReducerActions<
642641
State = any,
643642
> = Id<
644643
UnionToIntersection<
645-
SliceReducerCreators<
646-
State,
647-
CaseReducers,
648-
SliceName
649-
>[RegisteredReducerType]['actions']
644+
ConvertNeverKeysToUnknown<
645+
SliceReducerCreators<
646+
State,
647+
CaseReducers,
648+
SliceName
649+
>[RegisteredReducerType]['actions']
650+
>
650651
>
651652
>
652653

@@ -686,11 +687,13 @@ type SliceDefinedCaseReducers<
686687
State = any,
687688
> = Id<
688689
UnionToIntersection<
689-
SliceReducerCreators<
690-
State,
691-
CaseReducers,
692-
SliceName
693-
>[RegisteredReducerType]['caseReducers']
690+
ConvertNeverKeysToUnknown<
691+
SliceReducerCreators<
692+
State,
693+
CaseReducers,
694+
SliceName
695+
>[RegisteredReducerType]['caseReducers']
696+
>
694697
>
695698
>
696699

packages/toolkit/src/tests/createSlice.test-d.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import type {
1515
ReducerCreators,
1616
ReducerDefinition,
1717
ReducerHandlingContextMethods,
18-
ReducerNamesOfType,
1918
SliceActionType,
2019
SliceCaseReducers,
2120
ThunkAction,
@@ -894,10 +893,11 @@ declare module '@reduxjs/toolkit' {
894893
: never,
895894
{
896895
actions: {
897-
[ReducerName in ReducerNamesOfType<
898-
CaseReducers,
896+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends ReducerDefinition<
899897
typeof toasterCreatorType
900-
>]: AddToastThunk<Name, ReducerName>
898+
>
899+
? AddToastThunk<Name, ReducerName>
900+
: never
901901
}
902902
}
903903
>

packages/toolkit/src/tests/createSlice.test.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,11 @@ import type {
1212
ReducerCreatorEntry,
1313
ReducerCreators,
1414
ReducerDefinition,
15-
ReducerNamesOfType,
1615
SliceActionType,
1716
ThunkAction,
1817
WithSlice,
1918
} from '@reduxjs/toolkit'
2019
import {
21-
asyncThunkCreator,
2220
buildCreateSlice,
2321
combineSlices,
2422
configureStore,
@@ -998,18 +996,20 @@ declare module '@reduxjs/toolkit' {
998996
) => LoaderReducerDefinition<State>,
999997
{
1000998
actions: {
1001-
[ReducerName in ReducerNamesOfType<
1002-
CaseReducers,
999+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends ReducerDefinition<
10031000
typeof loaderCreatorType
1004-
>]: LoaderThunk<Name, ReducerName>
1001+
>
1002+
? LoaderThunk<Name, ReducerName>
1003+
: never
10051004
}
10061005
caseReducers: {
1007-
[ReducerName in ReducerNamesOfType<
1008-
CaseReducers,
1006+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends ReducerDefinition<
10091007
typeof loaderCreatorType
1010-
>]: Required<
1011-
Pick<LoaderReducerDefinition<State>, 'ended' | 'started'>
10121008
>
1009+
? Required<
1010+
Pick<LoaderReducerDefinition<State>, 'ended' | 'started'>
1011+
>
1012+
: never
10131013
}
10141014
}
10151015
>
@@ -1025,18 +1025,16 @@ declare module '@reduxjs/toolkit' {
10251025
: never,
10261026
{
10271027
actions: {
1028-
[ReducerName in ReducerNamesOfType<
1029-
CaseReducers,
1028+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends ReducerDefinition<
10301029
typeof historyMethodsCreatorType
1031-
>]: CaseReducers[ReducerName] extends { type: 'reset' }
1030+
> & { type: 'reset' }
10321031
? PayloadActionCreator<void, SliceActionType<Name, ReducerName>>
10331032
: never
10341033
}
10351034
caseReducers: {
1036-
[ReducerName in ReducerNamesOfType<
1037-
CaseReducers,
1035+
[ReducerName in keyof CaseReducers]: CaseReducers[ReducerName] extends ReducerDefinition<
10381036
typeof historyMethodsCreatorType
1039-
>]: CaseReducers[ReducerName] extends { type: 'reset' }
1037+
> & { type: 'reset' }
10401038
? CaseReducer<State, PayloadAction>
10411039
: never
10421040
}

0 commit comments

Comments
 (0)