التحقق من صحة البيانات في TypeScript: من النظرية إلى التطبيق
إحدى المشكلات الرئيسية عند التطوير باستخدام TypeScript هي الفجوة بين الكتابة الثابتة (static typing) والبيانات الفعلية التي تأتي من مصادر خارجية (API، نماذج، localStorage). يتحقق TypeScript من الأنواع في مرحلة التجميع (compile time)، ولكن في وقت التشغيل (runtime) تختفي الأنواع. التحقق من صحة البيانات هو عملية التحقق من مطابقة البيانات لقواعد معينة في وقت التشغيل، وهو أمر بالغ الأهمية لموثوقية التطبيقات.
في هذه المقالة، سنستعرض المكتبات الشائعة للتحقق من صحة البيانات في TypeScript: Zod وYup وJoi وclass-validator. سنناقش ميزاتها وأمثلة استخدامها ونساعدك في اختيار الأداة المناسبة لمشروعك.
لماذا لا يكفي TypeScript وحده؟
TypeScript هو أداة للمطور. يساعد في كتابة كود أكثر أمانًا، لكنه لا يحمي من:
- بيانات غير صحيحة من API (قد يأتي حقل
ageكسلسلة نصية"25") - غياب الحقول الإلزامية
- تنسيقات غير صحيحة (البريد الإلكتروني، URL، رقم الهاتف)
- خروج القيم عن النطاقات المسموح بها
يعمل التحقق من صحة البيانات في وقت التشغيل على حل هذه المشكلات عن طريق فحص البيانات وفقًا لمخطط وإصدار أخطاء واضحة.
Zod — المعيار الحديث
Zod هي المكتبة الأكثر شيوعًا للتحقق من الصحة في TypeScript. ميزتها الرئيسية هي التكامل الوثيق مع نظام الأنواع: يمكن استنتاج النوع تلقائيًا من المخطط.
التثبيت
npm install zodمثال على الاستخدام
import { z } from 'zod';
// تعريف المخططconst UserSchema = z.object({ id: z.number().positive(), email: z.string().email(), age: z.number().min(18).max(120).optional(), role: z.enum(['admin', 'user', 'guest']),});
// استنتاج النوع من المخططtype User = z.infer<typeof UserSchema>;
// التحقق من الصحةconst result = UserSchema.safeParse({ id: 1, email: 'user@example.com', age: 25, role: 'admin',});
if (result.success) { // result.data — بيانات صحيحة من النوع User console.log(result.data.email);} else { // result.error — معلومات مفصلة عن الأخطاء console.log(result.error.format());}الإمكانيات الرئيسية لـ Zod:
- استنتاج الأنواع تلقائيًا عبر
z.infer - تحويل البيانات (مثل تحويل السلاسل النصية إلى أرقام)
- التحقق من صحة الكائنات والمصفوفات المتداخلة
- دعم union وintersection وdiscriminated unions
- Refinement — فحوصات مخصصة
Yup — مجرب عبر الزمن
Yup هي مكتبة من مؤلفي Formik. مثالية للتحقق من صحة النماذج في React. تمتلك Yup بناء جملة تصريحيًا (declarative) ونظامًا بيئيًا غنيًا.
مثال
import * as yup from 'yup';
const schema = yup.object().shape({ name: yup.string().required('الاسم مطلوب'), email: yup.string().email('بريد إلكتروني غير صحيح').required(), age: yup.number().positive().integer().min(18, 'يجب أن يكون العمر 18 عامًا على الأقل'), tags: yup.array().of(yup.string()).min(1, 'اختر علامة واحدة على الأقل'),});
schema.validate({ name: 'إيفان', email: 'ivan@example.com', age: 25, tags: ['typescript'],}).then(validData => { console.log('البيانات صحيحة:', validData);}).catch(err => { console.log('خطأ:', err.errors);});ميزات Yup:
- ترجمة رسائل الخطأ (localization)
- التحقق عند الطلب (lazy validation)
- تحويل القيم (cast)
- التكامل مع Formik مباشرة
Joi — قوي وصارم
Joi هي مكتبة تحتوي على مجموعة ضخمة من أدوات التحقق. تم إنشاؤها في الأصل لـ Node.js (Hapi.js)، ولكنها تعمل بشكل ممتاز مع TypeScript أيضًا.
<