remeda لـ TypeScript: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

مكتبة remeda لـ TypeScript: الدليل الشامل

في عالم تطوير الويب الحديث باستخدام TypeScript، تعد معالجة البيانات من أكثر المهام شيوعًا. تمثل مكتبة remeda (المعروفة سابقًا باسم Remeda) بديلاً حديثًا وآمنًا من حيث الأنواع (type-safe) لمكتبة Lodash، وهي مصممة خصيصًا لـ TypeScript. في هذا المقال، سنشرح بالتفصيل ما هي remeda، وكيفية تثبيتها، وما هي الدوال التي تقدمها، وكيفية استخدامها في المشاريع الحقيقية.

1. ما هي remeda ولماذا تحتاجها؟

Remeda هي مكتبة أدوات للبرمجة الوظيفية (functional programming) في TypeScript. على عكس Lodash، الذي كُتب في الأصل لـ JavaScript وأضيفت له الأنواع لاحقًا، صُممت remeda منذ البداية مع مراعاة صرامة الكتابة (strict typing). هذا يعني أن جميع دوال remeda آمنة تمامًا من حيث الأنواع: يمكن لمترجم TypeScript استنتاج الأنواع الدقيقة للمدخلات والمخرجات، مما يقلل بشكل كبير من أخطاء وقت التشغيل.

لماذا تحتاج remeda؟ أولاً، توفر دوالًا مريحة للتعامل مع المصفوفات، الكائنات، النصوص، وهياكل البيانات الأخرى المستخدمة بكثرة في التطوير اليومي. ثانيًا، تشجع remeda على أسلوب البرمجة الوظيفية: معظم الدوال نقية (pure)، لا تغير البيانات الأصلية، ويمكن دمجها بسهولة باستخدام الأنابيب (pipe). ثالثًا، remeda صغيرة الحجم جدًا (قابلة للاقتطاع tree-shakeable)، مما يسمح بتضمين الدوال المستخدمة فقط في الحزمة النهائية.

المزايا الرئيسية لـ remeda مقارنة بـ Lodash: دعم كامل لـ TypeScript "مباشر من الصندوق"، الثبات (immutability) الافتراضي، دعم الأنابيب (pipe) لتركيب الدوال، بالإضافة إلى واجهة برمجة تطبيقات (API) أكثر حداثة تتوافق مع معايير ES6+.

2. التثبيت

يتم توزيع remeda عبر npm. للتثبيت، نفّذ الأمر التالي:

npm install remeda

أو إذا كنت تستخدم yarn:

yarn add remeda

بعد التثبيت، يمكنك استيراد الدوال بشكل فردي (الطريقة الموصى بها للاقتطاع tree-shaking)، أو استيراد الوحدة بأكملها:

// استيراد دوال فردية (موصى به)
import { pipe, map, filter } from 'remeda';

// استيراد الوحدة بأكملها
import * as R from 'remeda';

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

لنكتب مثالًا بسيطًا: لدينا مصفوفة أرقام، نريد تصفية الأرقام الزوجية، ثم ضرب كل منها في 2، وعرض النتيجة.

import { pipe, filter, map } from 'remeda';

const numbers = [1, 2, 3, 4, 5, 6];

const result = pipe(
    numbers,
    filter(x => x % 2 === 0), // [2, 4, 6]
    map(x => x * 2)           // [4, 8, 12]
);

console.log(result); // [4, 8, 12]

كما ترى، يُقرأ الكود كسلسلة من العمليات: "خذ numbers، صفّي الأرقام الزوجية، ثم اضرب في 2". هذا هو جوهر الأسلوب الوظيفي الذي تروّج له remeda.

4. الدوال الأساسية

لنستعرض 8 دوال رئيسية في remeda. لكل دالة، سنقدم التوقيع (signature)، وصفًا مختصرًا، ومثالًا.

4.1. pipe

التوقيع: pipe<A, B, C, ...>(value: A, ...fns: Function[]): LastReturnType

الوظيفة: تأخذ قيمة أولية وقائمة من الدوال. تطبق كل دالة على نتيجة الدالة السابقة بالتتابع. هذه هي الطريقة الأساسية لتركيب الدوال في remeda.

import { pipe } from 'remeda';

const addOne = (x: number) => x + 1;
const double = (x: number) => x * 2;

const result = pipe(5, addOne, double); // (5 + 1) * 2 = 12
console.log(result); // 12

4.2. map

التوقيع: map<T, R>(fn: (value: T, index: number, array: T[]) => R): (array: T[]) => R[]

توصيات