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

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

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

ابدأ الدورة

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

Effect-ts هي مكتبة قوية للغة TypeScript، تقدم مفاهيم البرمجة الوظيفية (Functional Programming) لكتابة كود نظيف، قابل للتركيب، وآمن من ناحية الأنواع. تحل المكتبة واحدة من أكبر المشكلات في تطوير TypeScript (وجافا سكريبت بشكل عام) وهي إدارة التأثيرات الجانبية (side effects).

في البرمجة التقليدية (الأمرية)، تكون التأثيرات الجانبية (مثل التعامل مع الشبكة، الملفات، قواعد البيانات، توليد أرقام عشوائية، التعامل مع الوقت) موزعة في جميع أنحاء الكود، مما يجعله صعبًا في الاختبار والتصحيح والتحليل. تقدم Effect-ts نهجًا أنيقًا: يتم وصف جميع التأثيرات الجانبية كبيانات (قيم) يمكن دمجها وتحويلها وتنفيذها في بيئة محكومة.

المزايا الرئيسية لـ Effect-ts:

  • أمان الأنواع: يتحقق مترجم TypeScript من أنواع الأخطاء والنتائج الناجحة على مستوى الأنواع.
  • قابلية التركيب: يمكن دمج التأثيرات بسهولة باستخدام دوال مثل map و flatMap و zip وغيرها.
  • إدارة الأخطاء: يتم التعامل مع الأخطاء كجزء من نوع التأثير، وليس من خلال الاستثناءات.
  • قابلية الاختبار: يمكن استبدال التبعيات (مثل عملاء HTTP، قواعد البيانات) بسهولة.
  • التوازي: دعم مدمج للعمليات غير المتزامنة والتوازي وإلغاء العمليات.
  • قابلية التوقع: يصبح الكود أكثر تصريحًا (Declarative) وأسهل في الفهم.

تعتبر Effect-ts مفيدة بشكل خاص في المشاريع الكبيرة التي تتطلب الموثوقية وقابلية الاختبار والتوسع. تُستخدم في تطوير الواجهات الخلفية (Node.js)، والواجهات الأمامية (React)، وحتى في تطبيقات الهواتف المحمولة.

التثبيت

لتثبيت Effect-ts في مشروعك، استخدم npm أو yarn:

npm install effect

أو

yarn add effect

تأكد أيضًا من تثبيت TypeScript الإصدار 4.7 أو أحدث:

npm install typescript --save-dev

للعمل مع Effect-ts، ستحتاج إلى إعداد ملف tsconfig.json مع تفعيل الوضع الصارم (strict: true) ويفضل target: "ES2020" أو أحدث.

بداية سريعة مع مثال كود

لنكتب برنامجًا بسيطًا يقرأ اسم المستخدم من سطر الأوامر ويطبع تحية. هذا يوضح المفهوم الأساسي لـ Effect-ts: وصف التأثير وتنفيذه.

import { Effect, Console } from "effect"

// وصف التأثير: طلب الاسم
const askName: Effect.Effect<string> = Effect.sync(() => {
  // في تطبيق حقيقي، سيكون هنا إدخال من لوحة المفاتيح
  return "أحمد"
})

// وصف التأثير: طباعة التحية
const greet = (name: string): Effect.Effect<void> =>
  Console.log(`مرحبًا، ${name}!`)

// دمج التأثيرات
const program: Effect.Effect<void> = askName.pipe(
  Effect.flatMap(greet)
)

// تشغيل البرنامج
Effect.runSync(program)
// الإخراج: مرحبًا، أحمد!

في هذا المثال:

  • Effect.sync — ينشئ تأثيرًا من دالة متزامنة.
  • Console.log — هو تأثير للطباعة في وحدة التحكم.
  • pipe — يسمح بتطبيق الدوال على القيمة بشكل تسلسلي.
  • flatMap — يُستخدم لتنفيذ التأثيرات بشكل تسلسلي.
  • Effect.runSync — ينفذ التأثير بشكل متزامن (للتأثيرات المتزامنة فقط).

الدوال الأساسية في Effect-ts

1. Effect.sync

الوظيفة: ينشئ تأثيرًا يغلف دالة متزامنة. يتم تنفيذ الدالة بشكل كسول (فقط عند تشغيل التأثير).

المعاملات:

  • f: () => A — دالة متزامنة تُرجع قيمة من النوع A.

مثال:

import { Effect } from "effect"

const getRandomInt: Effect.Effect<number> = Effect.sync(() => {
  retur                    

توصيات