typescript - Metoden thunkAPI.getState slår ikke korrekt fast tilstandstypen
Kode her:
users.slice.ts:
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
const userAPI = {
async fetchById(userId: string) {
return { data: { id: userId, name: 'teresa teng' } };
},
};
export const fetchUserById = createAsyncThunk<User, string>(
'users/fetchByIdStatus',
async (userId, thunkAPI) => {
const response = await userAPI.fetchById(userId);
return response.data;
},
{
condition: (userId, { getState }) => {
const { users } = getState();
const { fetchStatus } = users[userId];
if (fetchStatus === 'loading') {
return false;
}
},
}
);
interface User {
name: string;
id: string;
}
interface UsersSliceState {
[id: string]: { fetchStatus: 'idle' | 'loading'; data: User };
}
const usersSliceState: UsersSliceState = {
1: {
fetchStatus: 'idle',
data: { name: '', id: '' },
},
};
const usersSlice = createSlice({
name: 'users',
initialState: usersSliceState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(fetchUserById.fulfilled, (state, action) => {
console.log(action);
});
},
});
export default usersSlice.reducer;
store.ts:
import { configureStore } from '@reduxjs/toolkit';
import usersSliceReducer from './users.slice';
export const store = configureStore({
reducer: {
users: usersSliceReducer,
},
});
export type RootState = ReturnType<typeof store.getState>;
main.ts:
import { store } from './store';
import { fetchUserById } from './users.slice';
store.dispatch(fetchUserById('1'));
TSC kaster en feil når jeg kaller getState()-metoden og dekonstruerer users-tilstandsdelen inne i condition-funksjonen
Egenskapen 'users' eksisterer ikke på typen '{}'.ts(2339)
Den RootState-typen som er utledet er:
type RootState = {
users: UsersSliceState;
}
Hvordan bør jeg lage denne typen korrekt? Hvis jeg importerer RootState-typen og typer koffes returnverdien av getState(), vil det forårsake sirkulære referanser?
pakkeversjoner:
"@reduxjs/toolkit": "^1.5.0",
"typescript": "^4.1.2"
Svar #1
Du må spesifisere state i createAsyncThunk til å være RootState, hvor state er en del av de valgfrie feltene for å definere thunkApi-felttypene.
export const fetchUserById = createAsyncThunk<
User,
string,
{ state: RootState}
>(
'users/fetchByIdStatus',
async (userId, thunkAPI) => {
const response = await userAPI.fetchById(userId);
return response.data;
},
{
condition: (userId, { getState }) => {
const { users } = getState();
const { fetchStatus } = users[userId];
if (fetchStatus === 'loading') {
return false;
}
},
}
);
Svar #2
For å unngå sirkulære avhengigheter, hva med noe sånt som dette?
I stedet for
createAsyncThunk<User, string>
Bruk
createAsyncThunk<User, string, {state: {users: UserSliceState}}>
