属性 'pending' 在类型 'AsyncThunkAction<Languages, void, { state: languagesState; }>'.ts(2339) 上不存在,使用 Redux Toolkit
Property 'pending' does not exist on type 'AsyncThunkAction<Languages, void, { state: languagesState; }>'.ts(2339) using Redux Toolkit
我是 Typescript 的新手,所以我希望我的界面不会使它变得比它必须的更复杂。我一直在处理他们 'start' 所在的任何打字稿错误,并从那里继续前进,希望我能解决它并边走边学。似乎我在这个 redux 切片中留下的唯一红色是 .pending、.fulfilled 和 .rejected 片段。我对可以将它们放在我的界面中的什么位置感到有点困惑,并且希望收到有关如何完全改进我的界面的任何反馈。这是我的语言 API:
import axios from 'axios';
export interface Language {
id: number,
language: string,
status: string,
error: string | undefined | undefined
}
export interface GetLanguagesResult {
languages: {
[key: string]: Language
};
}
export async function getLanguages(): Promise<GetLanguagesResult> {
const url = 'http://localhost:4000/languages'
const languagesResponse = await axios.get<{data: Language}>(url);
console.log("data: ", typeof languagesResponse.data);
return {
languages: languagesResponse.data,
};
}
这是我的语言切片:
import {createAsyncThunk, createEntityAdapter, createSlice} from '@reduxjs/toolkit';
import {getLanguages, Language} from './languagesAPI';
interface languagesState {
entities: Languages;
ids: Array<number> [];
status: 'idle' | 'pending' | 'fulfilled' | 'rejected';
error: string | null;
pending: string | null;
fulfilled: string | null;
rejected: string | null
}
interface Languages {
[key: string]: Language,
}
const languagesAdapter = createEntityAdapter<Language>({
selectId: language => language.id
})
const initialState: languagesState = languagesAdapter.getInitialState({
entities: {} as Languages,
ids: [],
status: 'idle',
error: null,
pending: null,
fulfilled: null,
rejected: null,
}) as languagesState;
/* eslint-disable */
export const fetchLanguages = createAsyncThunk<
// Return type of the payload creator
Languages,
// pending: string | null,
// First argument to the payload creator (provide void if there isn't one)
void,
{state: languagesState}
>('languages/fetch', async (_, thunkAPI) => {
async () => {
if (thunkAPI.getState().status !== 'idle') {
return;
}
};
const response = await getLanguages();
console.log("languages: ", response.languages);
return response.languages;
})();
/* eslint-disable */
export const languagesSlice = createSlice({
name: 'languages',
initialState,
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchLanguages.pending, (state) => {
if (state.status === 'idle') {
state.status = 'idle';
}
})
.addCase(fetchLanguages.fulfilled, (state, action) => {
if (state.status === 'idle') {
state.status = 'idle';
}
state.languages = action.payload;
})
.addCase(fetchLanguages.rejected, (state, action) => {
if (state.status === 'idle') {
state.status = 'idle';
state.error = action.error.message || null;
}
});
},
});
export default languagesSlice.reducer
export const { selectAll: selectAllLanguages } = languagesAdapter.getSelectors(
state => {
return state.languages
}
)
感谢您的帮助,这几天一直在努力解决这个问题!
你的错误在这一行:
return response.languages;
})();
/* eslint-disable */
您不应立即执行异步 thunk 操作创建者,而应仅在调度时执行。
正确的是
return response.languages;
});
/* eslint-disable */
我是 Typescript 的新手,所以我希望我的界面不会使它变得比它必须的更复杂。我一直在处理他们 'start' 所在的任何打字稿错误,并从那里继续前进,希望我能解决它并边走边学。似乎我在这个 redux 切片中留下的唯一红色是 .pending、.fulfilled 和 .rejected 片段。我对可以将它们放在我的界面中的什么位置感到有点困惑,并且希望收到有关如何完全改进我的界面的任何反馈。这是我的语言 API:
import axios from 'axios';
export interface Language {
id: number,
language: string,
status: string,
error: string | undefined | undefined
}
export interface GetLanguagesResult {
languages: {
[key: string]: Language
};
}
export async function getLanguages(): Promise<GetLanguagesResult> {
const url = 'http://localhost:4000/languages'
const languagesResponse = await axios.get<{data: Language}>(url);
console.log("data: ", typeof languagesResponse.data);
return {
languages: languagesResponse.data,
};
}
这是我的语言切片:
import {createAsyncThunk, createEntityAdapter, createSlice} from '@reduxjs/toolkit';
import {getLanguages, Language} from './languagesAPI';
interface languagesState {
entities: Languages;
ids: Array<number> [];
status: 'idle' | 'pending' | 'fulfilled' | 'rejected';
error: string | null;
pending: string | null;
fulfilled: string | null;
rejected: string | null
}
interface Languages {
[key: string]: Language,
}
const languagesAdapter = createEntityAdapter<Language>({
selectId: language => language.id
})
const initialState: languagesState = languagesAdapter.getInitialState({
entities: {} as Languages,
ids: [],
status: 'idle',
error: null,
pending: null,
fulfilled: null,
rejected: null,
}) as languagesState;
/* eslint-disable */
export const fetchLanguages = createAsyncThunk<
// Return type of the payload creator
Languages,
// pending: string | null,
// First argument to the payload creator (provide void if there isn't one)
void,
{state: languagesState}
>('languages/fetch', async (_, thunkAPI) => {
async () => {
if (thunkAPI.getState().status !== 'idle') {
return;
}
};
const response = await getLanguages();
console.log("languages: ", response.languages);
return response.languages;
})();
/* eslint-disable */
export const languagesSlice = createSlice({
name: 'languages',
initialState,
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchLanguages.pending, (state) => {
if (state.status === 'idle') {
state.status = 'idle';
}
})
.addCase(fetchLanguages.fulfilled, (state, action) => {
if (state.status === 'idle') {
state.status = 'idle';
}
state.languages = action.payload;
})
.addCase(fetchLanguages.rejected, (state, action) => {
if (state.status === 'idle') {
state.status = 'idle';
state.error = action.error.message || null;
}
});
},
});
export default languagesSlice.reducer
export const { selectAll: selectAllLanguages } = languagesAdapter.getSelectors(
state => {
return state.languages
}
)
感谢您的帮助,这几天一直在努力解决这个问题!
你的错误在这一行:
return response.languages;
})();
/* eslint-disable */
您不应立即执行异步 thunk 操作创建者,而应仅在调度时执行。
正确的是
return response.languages;
});
/* eslint-disable */