fp-ts لـ TypeScript: دليل شامل مع أمثلة عملية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

fp-ts لـ TypeScript: دليل شامل للبرمجة الوظيفية

1. ما هي مكتبة fp-ts ولماذا تحتاجها؟

fp-ts (اختصارًا لـ Functional Programming in TypeScript) هي مكتبة قوية مفتوحة المصدر تُدخل نموذج البرمجة الوظيفية (Functional Programming) إلى لغة TypeScript. توفر المكتبة مجموعة من الأنواع (Types) والدوال (Functions) والمُركِّبات (Combinators) المستوحاة من لغات مثل Haskell وPureScript وScala. على عكس الأسلوب الأمري (Imperative) أو البرمجة كائنية التوجه (Object-Oriented)، تتيح لك fp-ts كتابة كود نقي، قابل للتوقع، وسهل الاختبار. تم بناء المكتبة على مفاهيم مثل Functors وMonads وApplicative Functors وغيرها من التجريدات التي تساعد في إدارة الآثار الجانبية، ومعالجة الأخطاء، والعمل مع العمليات غير المتزامنة دون استثناءات أو تغيير في الحالة.

لماذا تستخدم fp-ts؟ في التطوير الحديث باستخدام TypeScript، نواجه غالبًا مشكلات مثل: استثناءات غير متوقعة (مثل التعامل مع null أو undefined)، صعوبة في الاختبار بسبب التبعيات المخفية والآثار الجانبية، وكود غير متزامن معقد باستخدام Callbacks. تحل fp-ts هذه المشكلات من خلال تقديم نظام أنواع صارم وتجريدات قابلة للتركيب. على سبيل المثال، النوع Option يُنمذج بوضوح حالة غياب القيمة، بينما Either يُنمذج معالجة الأخطاء دون الحاجة إلى try/catch. هذا يجعل الكود أكثر أمانًا وتوثيقًا على مستوى الأنواع.

هذه المكتبة مفيدة بشكل خاص في المشاريع ذات المنطق التجاري المعقد، حيث تكون الموثوقية وقابلية الصيانة أمرًا بالغ الأهمية. كما أنها مناسبة تمامًا للفرق التي ترغب في تبني مبادئ البرمجة الوظيفية بشكل تدريجي دون إعادة كتابة المشروع بأكمله. تحظى fp-ts بدعم نشط من المجتمع ولديها نظام بيئي غني، بما في ذلك التكامل مع io-ts (للتحقق من صحة البيانات)، وmonocle-ts (للعدسات - Lenses)، وhyper-ts (لخوادم الويب).

2. التثبيت

يتم توزيع fp-ts عبر npm. للتثبيت، قم بتشغيل الأمر التالي:

npm install fp-ts

يوصى أيضًا بتثبيت @types/node لدعم أنواع Node.js إذا كنت تعمل خارج المتصفح:

npm install -D @types/node

يتطلب العمل مع fp-ts إصدار TypeScript 4.0 أو أعلى. تأكد من تفعيل الخيار "strict": true في ملف tsconfig.json الخاص بك لتحقيق أقصى درجات أمان الأنواع.

3. البداية السريعة — مثال عملي بسيط

لننظر إلى مثال بسيط: عملية قسمة آمنة لعددين مع معالجة حالة القسمة على صفر. بدون fp-ts، سنكتب الكود التالي:

function divide(a: number, b: number): number | null {
  if (b === 0) return null;
  return a / b;
}

const result = divide(10, 2);
if (result !== null) {
  console.log(result); // 5
}

مع fp-ts، نستخدم النوع Option:

import { pipe } from 'fp-ts/function';
import { Option, some, none, fromPredicate } from 'fp-ts/Option';

const safeDivide = (a: number, b: number): Option =>
  pipe(
    b,
    fromPredicate((x) => x !== 0),
    Option.map((divisor) => a / divisor)
  );

const result = safeDivide(10, 2);
// result: Option — some(5) أو none

// استخراج القيمة
import { fold } from 'fp-ts/Option';

const message = pipe(
  result,
  fold(
    () => 'خطأ: القسمة على صفر',
    (value) => `النتيجة: ${value}`
  )
);
console.log(message); // "النتيجة: 5"

يوضح هذا المثال المبادئ الأساسية لـ fp-ts: التركيب عبر pipe، والنمذجة الصريحة لغياب القيمة، ومعالجة الأخطاء دون استثناءات.

4. أهم الدوال/الوظائف/الفئات

4.1. Option — التعامل مع القيم الاختيارية

التوقيع (Signature):

// المُنشئات (Constructors)
declare const some: (a: A) => Option;
declare const none: Option;

// أهم الدوال
declare const map: (f: (a: A) => B) => (fa: Option                    

توصيات