تحديد أنواع شرائح Redux Toolkit وThunks
استخدموا createSlice وcreateAsyncThunk مع استدلال كامل للأنواع
تحديد أنواع شرائح Redux Toolkit وThunks درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
لماذا نُنمّط Redux Toolkit؟
يتضمن Redux Toolkit (RTK) دعمًا ممتازًا لـ TypeScript. ويضمن التنميط الصحيح أن تكون الإجراءات والحالة وthunks غير المتزامنة آمنة من ناحية الأنواع، من دون الحاجة إلى تأكيدات أنواع يدوية.
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";تنميط واجهة الحالة
عرّفوا حالة slice الخاصة بكم كواجهة TypeScript قبل إنشاء slice.
interface UserState {
users: User[];
loading: boolean;
error: string | null;
}
const initialState: UserState = {
users: [],
loading: false,
error: null,
};createSlice مع حالة مُنمّطة
مرّروا نوع الحالة كمعامل عام لضمان تلقي دوال الاختزال لحالة مُنمّطة بشكل صحيح.
const userSlice = createSlice({
name: "users",
initialState,
reducers: {
setLoading(state, action: PayloadAction<boolean>) {
state.loading = action.payload; // state: UserState — typed
},
},
});تنميط PayloadAction
استخدموا PayloadAction من RTK لتنميط action.payload داخل دوال الاختزال.
import { PayloadAction } from "@reduxjs/toolkit";
reducers: {
addUser(state, action: PayloadAction<User>) {
state.users.push(action.payload); // action.payload: User
},
}createAsyncThunk مع الأنواع
حدّدوا أنواع قيمة الإرجاع ووسيط thunk وإعدادات واجهة برمجة تطبيقات thunk.
const fetchUsers = createAsyncThunk<User[], void, { rejectValue: string }>(
"users/fetchAll",
async (_, { rejectWithValue }) => {
try {
return await api.getUsers();
} catch (e) {
return rejectWithValue("Failed to fetch");
}
}
);معالجة إجراءات Thunk في extraReducers
استخدموا واجهة برمجة التطبيقات الخاصة باستدعاء builder لمعالجة إجراءات thunk المعلّقة والمكتملة والمرفوضة مع تنميط كامل.
const userSlice = createSlice({
name: "users",
initialState,
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchUsers.pending, (state) => { state.loading = true; })
.addCase(fetchUsers.fulfilled, (state, action) => {
state.users = action.payload; // action.payload: User[]
state.loading = false;
})
.addCase(fetchUsers.rejected, (state, action) => {
state.error = action.payload ?? "Unknown error";
});
},
});RootState وAppDispatch مُنمّطان
صدّروا RootState وAppDispatch مُنمّطين من ملف المخزن لاستخدامهما في المحددات والخطافات.
import { configureStore } from "@reduxjs/toolkit";
const store = configureStore({ reducer: { users: userSlice.reducer } });
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;useSelector وuseDispatch مُنمّطان
أنشئوا نسخًا مُنمّطة من خطافات Redux لتجنب تكرار تأكيدات الأنواع في كل مكوّن.
import { useDispatch, useSelector, TypedUseSelectorHook } from "react-redux";
export const useAppDispatch = () => useDispatch<AppDispatch>();
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;تنميط RTK Query
ينشئ RTK Query خطافات مُنمّطة بالكامل انطلاقًا من تعريفات نقاط النهاية؛ فلا حاجة إلى تنميط الاستجابات يدويًا.
const api = createApi({
reducerPath: "api",
baseQuery: fetchBaseQuery({ baseUrl: "/api" }),
endpoints: (build) => ({
getUser: build.query<User, string>({
query: (id) => `/users/${id}`,
}),
}),
});
export const { useGetUserQuery } = api;تنميط المحددات
اكتبوا محددات مُنمّطة باستخدام RootState لضمان الوصول إلى الحالة بأمان من ناحية الأنواع.
const selectUsers = (state: RootState): User[] => state.users.users;
const selectLoading = (state: RootState): boolean => state.users.loading;مراجعة: RTK المُنمّط
TypeScript في Redux Toolkit: عرّفوا واجهة للحالة، واستخدموا PayloadAction في دوال الاختزال، ونمّطوا المعاملات العامة لـ createAsyncThunk، وصدّروا RootState وAppDispatch، وأنشئوا أغلفة خطافات مُنمّطة.
تحقق سريع
ما تعليق النوع الذي يجعل action.payload آمنًا من ناحية الأنواع داخل دالة اختزال RTK؟
ما تعلمتموه
TypeScript في Redux Toolkit: عرّفوا واجهات حالات slice، واستخدموا PayloadAction في دوال الاختزال، ونمّطوا createAsyncThunk باستخدام ثلاثة معاملات عامة، وصدّروا RootState وAppDispatch مُنمّطين مع أغلفة الخطافات لاستخدامها في المكوّنات.
الأسئلة الشائعة
هل درس «تحديد أنواع شرائح Redux Toolkit وThunks» مجاني؟
نعم — نص درس «تحديد أنواع شرائح Redux Toolkit وThunks» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحديد أنواع شرائح Redux Toolkit وThunks»؟
استخدموا createSlice وcreateAsyncThunk مع استدلال كامل للأنواع تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تحديد أنواع شرائح Redux Toolkit وThunks»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحديد أنواع شرائح Redux Toolkit وThunks
- أنماط تحديد أنواع مخازن Zustand
- XState: آلات حالات محددة الأنواع
- الحالة المشتقة والمنتقون مع الأنواع