نمذجة أنواع Result
مثّلوا النجاح والفشل كبيانات باستخدام Result
نمذجة أنواع Result درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
نوع Result
يمثّل Result عمليةً تنجح إما بقيمة أو تفشل بخطأ، وذلك على هيئة اتحاد مميّز يمكنك إعادته بدلاً من إطلاق استثناء.
تعريف Result
يستخدم الشكل التقليدي الحقل ok لتمييز الفرع. عندما تكون قيمة ok صحيحة، توجد قيمة value؛ وعندما تكون خاطئة، يوجد error.
type Result<T, E> =
| { ok: true; value: T }
| { ok: false; error: E };دوال مساعدة للإنشاء
تجعل الدالتان المساعدتان الصغيرتان ok وerr إنشاء النتائج موجزاً وسهل القراءة، بدلاً من كتابة الكائنات حرفياً في كل مرة.
const ok = <T>(value: T): Result<T, never> => ({ ok: true, value });
const err = <E>(error: E): Result<never, E> => ({ ok: false, error });إرجاع Result
تُعيد الدالة القابلة للفشل ok(value) أو err(error). ويعلن نوع الإعادة هذين الاحتمالين لكل مستدعٍ.
function divide(a: number, b: number): Result<number, string> {
return b === 0 ? err("divide by zero") : ok(a / b);
}تضييق النوع باستخدام ok
يؤدي التحقق من result.ok إلى تضييق الاتحاد. ففي الفرع الصحيح يعرف TypeScript أن value موجودة، وفي الفرع الخاطئ يعرف أن error موجود.
const r = divide(10, 2);
if (r.ok) console.log(r.value); // 5
else console.log(r.error);المميّز يقود إلى الأمان
يمثّل الحقل ok المميّز الذي يتيح للمترجم اختيار الفرع الصحيح. ولا يمكنك الوصول إلى value قبل إثبات أن ok صحيحة.
const r = divide(1, 0);
// r.value here is a type error until we check r.ok
if (!r.ok) console.log("err:", r.error);أخطاء ذات أنواع
يمكن أن تكون الأخطاء أكثر تفصيلاً من مجرد سلاسل نصية. يتيح استخدام اتحاد أخطاء ذي أنواع للمستدعين معالجة كل نوع بدقة بعد تضييق النوع.
type DivErr = { kind: "zero" } | { kind: "overflow" };
function div(a: number, b: number): Result<number, DivErr> {
if (b === 0) return err({ kind: "zero" });
return ok(a / b);
}معالجة شاملة للأخطاء
بما أن نوع الخطأ اتحاد، يمكن فحص جملة switch على مميّزه للتأكد من شمولها، مما يضمن معالجة كل حالة فشل.
const r = div(1, 0);
if (!r.ok) {
switch (r.error.kind) {
case "zero": console.log("no zero"); break;
case "overflow": console.log("too big"); break;
}
}دالة مساعدة للقيمة الافتراضية
قد ترغب أحياناً في الحصول على القيمة أو قيمة بديلة فقط. تُقرأ unwrapOr الصغيرة بوضوح، وتُبقي معالجة الفشل في موضعها.
function unwrapOr<T, E>(r: Result<T, E>, fallback: T): T {
return r.ok ? r.value : fallback;
}
console.log(unwrapOr(divide(1, 0), -1)); // -1Result مقابل إطلاق الاستثناءات
ينقل Result الفشل إلى نوع الإعادة، لذلك يجب على المستدعين التعامل معه. والمقابل هو كتابة أكثر صراحة، وهو أمر يستحق ذلك عادةً في حالات الخطأ المتوقعة.
مثال كامل
بتجميع كل ذلك: عرّف الدوال المساعدة، وأعد النتائج، وضيّق النوع قبل الاستخدام. ويضمن المترجم الإقرار بفرع الخطأ.
function safeParse(s: string): Result<number, string> {
const n = Number(s);
return Number.isNaN(n) ? err("NaN") : ok(n);
}
const p = safeParse("42");
console.log(p.ok ? p.value : p.error); // 42مراجعة سريعة
مراجعة سريعة لهذا الدرس.
مراجعة
إن Result<T, E> اتحاد مميّز يتخذ الشكل { ok: true; value } أو { ok: false; error }. أنشئه باستخدام الدالتين المساعدتين ok/err، وضيّق النوع على ok للوصول بأمان إلى value أو error، بينما تتيح الأخطاء ذات الأنواع معالجة شاملة لكل الحالات.
الأسئلة الشائعة
هل درس «نمذجة أنواع Result» مجاني؟
نعم — نص درس «نمذجة أنواع Result» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمذجة أنواع Result»؟
مثّلوا النجاح والفشل كبيانات باستخدام Result تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «نمذجة أنواع Result»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مشكلة طرح الأخطاء
- نمذجة أنواع Result
- أنواع Option وMaybe
- البرمجة الموجّهة بالمسار