如何使用 reduxjs/toolkit 在 extraReducer 中设置操作类型
How to set action type in extraReducer using reduxjs/toolkit
我正在使用 reduxjs/toolkit 学习 React,我创建了 thunk,但我在打字时遇到问题。
我收到此错误:Type 'unknown' is not assignable to type 'WritableDraft<MovieModel>[]'
接口和类型
interface StateModel {
movies: MovieModel[];
isFetching: boolean;
errorMessage: any;
}
type MyApiResponse = {
[key: string]: MovieModel[];
};
我的声音:
export const fetchMoviesAsync = createAsyncThunk('movies/fetchMoviesAsync', async () => {
try {
const response = await fetch(
'https://react-movies-b6b21-default-rtdb.firebaseio.com/movies.json'
);
if (!response.ok) {
throw new Error('Error fetching data ');
}
const data = await response.json();
const transformedData = Object.entries(data as MyApiResponse).map(([key, value]) => {
return {
...value,
id: key,
};
});
return transformedData;
} catch (error) {
return error;
}
});
电影片段:
export const moviesSlice = createSlice({
name: 'movies/fetchMoviesAsync',
initialState,
reducers: {},
extraReducers: builder => {
builder.addCase(fetchMoviesAsync.pending, state => {
state.isFetching = true;
});
builder.addCase(fetchMoviesAsync.fulfilled, (state, action) => {
state.isFetching = false;
state.movies = action.payload; // this line is getting error
});
builder.addCase(fetchMoviesAsync.rejected, (state, action) => {
state.isFetching = false;
state.errorMessage = action.payload;
});
},
});
我试过像这样为我的 thunk 设置类型:
export const fetchMoviesAsync = createAsyncThunk<MovieModel[]>('movies/fetchMoviesAsync', async () => {}
但随后我收到其他错误:
Argument of type '() => Promise<unknown>' is not assignable to parameter of type 'AsyncThunkPayloadCreator<MovieModel[], void, {}>'
未在 extraReducer
中设置操作类型 - extraReducer
使用您 createAsyncThunk
的操作类型。
你必须做
createAsyncThunk<YourExpectedReturnType>('movies/fetchMoviesAsync', // ...
有关详细信息,请参阅 usage with TypeScript。
在旁注中,您的 return error
将进入已完成的案例,而不是被拒绝的案例。您可能想使用 rejectWithValue
.
我正在使用 reduxjs/toolkit 学习 React,我创建了 thunk,但我在打字时遇到问题。
我收到此错误:Type 'unknown' is not assignable to type 'WritableDraft<MovieModel>[]'
接口和类型
interface StateModel {
movies: MovieModel[];
isFetching: boolean;
errorMessage: any;
}
type MyApiResponse = {
[key: string]: MovieModel[];
};
我的声音:
export const fetchMoviesAsync = createAsyncThunk('movies/fetchMoviesAsync', async () => {
try {
const response = await fetch(
'https://react-movies-b6b21-default-rtdb.firebaseio.com/movies.json'
);
if (!response.ok) {
throw new Error('Error fetching data ');
}
const data = await response.json();
const transformedData = Object.entries(data as MyApiResponse).map(([key, value]) => {
return {
...value,
id: key,
};
});
return transformedData;
} catch (error) {
return error;
}
});
电影片段:
export const moviesSlice = createSlice({
name: 'movies/fetchMoviesAsync',
initialState,
reducers: {},
extraReducers: builder => {
builder.addCase(fetchMoviesAsync.pending, state => {
state.isFetching = true;
});
builder.addCase(fetchMoviesAsync.fulfilled, (state, action) => {
state.isFetching = false;
state.movies = action.payload; // this line is getting error
});
builder.addCase(fetchMoviesAsync.rejected, (state, action) => {
state.isFetching = false;
state.errorMessage = action.payload;
});
},
});
我试过像这样为我的 thunk 设置类型:
export const fetchMoviesAsync = createAsyncThunk<MovieModel[]>('movies/fetchMoviesAsync', async () => {}
但随后我收到其他错误:
Argument of type '() => Promise<unknown>' is not assignable to parameter of type 'AsyncThunkPayloadCreator<MovieModel[], void, {}>'
未在 extraReducer
中设置操作类型 - extraReducer
使用您 createAsyncThunk
的操作类型。
你必须做
createAsyncThunk<YourExpectedReturnType>('movies/fetchMoviesAsync', // ...
有关详细信息,请参阅 usage with TypeScript。
在旁注中,您的 return error
将进入已完成的案例,而不是被拒绝的案例。您可能想使用 rejectWithValue
.