AzLearn

نمط Result

Result Pattern

مفهوم ~22 دقيقة

نمط Result — Result Pattern

نمط Result يجعل الفشل جزءاً من النوع. بدلاً من أن ترمي الدالة exception في كل حالة، يمكن أن ترجع { ok: true; value: T } أو { ok: false; error: string }. هذا يجبر المستدعي على التعامل مع الحالتين.

النمط لا يلغي exceptions تماماً. لكنه ممتاز للعمليات المتوقعة الفشل: parsing، validation، API calls، وقراءة config. عندما يكون الفشل متوقعاً، اجعله في النوع.

مثال عملي

index.ts

TypeScript يضيق النوع بعد result.ok. هذه قراءة هادئة للفشل.

حالات حافة في Number()

Number(text) يُخفي حالات طرفية: Number("") يرجع 0، وNumber(" ") يرجع 0، وNumber(null) يرجع 0. الاختبار بـNumber.isFinite يُمرّر هذه الحالات كأرقام صالحة. في الكود أعلاه أضفنا value <= 0 للتحقق من الإيجابية، لكن إذا كنت تقبل الصفر أيضاً، احتاج فحص إضافي للسلسلة الفارغة:

function parseNumber(text: string): Result<number> {
  if (text.trim() === "") {
    return { ok: false, error: "Empty input" };
  }
  const value = Number(text);
  if (!Number.isFinite(value)) {
    return { ok: false, error: "Not a number" };
  }
  return { ok: true, value };
}

افهم ما يُغطيه Number.isFinite وما لا يُغطيه قبل استخدامه كحارس وحيد.

تحدي — Challenge