نمط Result
Result Pattern
نمط Result — Result Pattern
نمط Result يجعل الفشل جزءاً من النوع. بدلاً من أن ترمي الدالة exception في كل حالة، يمكن أن ترجع { ok: true; value: T } أو { ok: false; error: string }. هذا يجبر المستدعي على التعامل مع الحالتين.
النمط لا يلغي exceptions تماماً. لكنه ممتاز للعمليات المتوقعة الفشل: parsing، validation، API calls، وقراءة config. عندما يكون الفشل متوقعاً، اجعله في النوع.
مثال عملي
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 وما لا يُغطيه قبل استخدامه كحارس وحيد.