لماذا TypeScript ليس مجرد موضة، بل ضرورة
\n\nعندما قدمت Microsoft TypeScript في عام 2012، كان القليلون يصدقون أن الإضافة فوق JavaScript ستصبح معيار الصناعة. اليوم، TypeScript ليس مجرد "لغة أخرى"، بل نظام بيئي كامل يغير نهج التطوير. وفقًا لبيانات State of JS 2023، أكثر من 70% من المطورين المشاركين في الاستطلاع يستخدمون TypeScript في مشاريعهم، وهذا الرقم في ازدياد مستمر.
\n\nلكن الأمر لا يتعلق فقط بالكتابة الثابتة. السحر الحقيقي لـ TypeScript يتجلى من خلال المكتبات التي تستخدم إمكانياته بنسبة 100%. انسَ "الغلافات" المملة لحزم JavaScript - سنتحدث عن أدوات TypeScript الأصلية الحقيقية التي ستجعل كودك يغني.
\n\nفي هذه المقالة، سنستعرض المكتبات الأكثر إثارة للاهتمام والفائدة لـ TypeScript التي تستحق الإضافة إلى ترسانتك في عام 2024. من التحقق من صحة البيانات إلى العمل مع قواعد البيانات - استعد للدهشة.
\n\nZod: ملك التحقق من صحة البيانات
\n\nإذا سبق لك كتابة كود للتحقق من صحة بيانات الإدخال يدويًا، فأنت تعلم كم هو مرهق. Zod يحل هذه المشكلة بأناقة وبطريقة مقيدة بالأنواع.
\n\nلماذا Zod بدلاً من Joi أو Yup؟
\n\nالميزة الرئيسية لـ Zod هي نهج TypeScript-first. جميع المخططات تستنتج الأنواع تلقائيًا، ولست بحاجة لتكرار الأنواع يدويًا. لا typeof، ولا واجهات تحتاج لمزامنتها مع أدوات التحقق.
import { z } from 'zod';\n\n// إنشاء مخطط\nconst UserSchema = z.object({\n name: z.string().min(2, 'يجب أن يكون الاسم أطول من حرفين'),\n email: z.string().email('بريد إلكتروني غير صحيح'),\n age: z.number().int().positive().optional(),\n role: z.enum(['admin', 'user', 'moderator']).default('user'),\n});\n\n// الحصول على النوع تلقائيًا\ntype User = z.infer<typeof UserSchema>;\n// { name: string; email: string; age?: number; role: "admin" | "user" | "moderator" }\n\n// التحقق من صحة البيانات\nconst result = UserSchema.safeParse({\n name: 'آنا',\n email: 'anna@example.com',\n age: 25,\n});\n\nif (!result.success) {\n console.error(result.error.errors);\n} else {\n // result.data — كائن مقيد بالأنواع بالكامل\n console.log(result.data.name); // string\n}\n\nZod يدعم أيضًا المخططات المعقدة: الاتحادات (union)، التقاطعات (intersection)، الأنواع التكرارية وحتى تحويلات البيانات. إنه الخيار المثالي للتحقق من صحة API، النماذج والتكوينات.
Prisma: ORM الذي يشعر بـ TypeScript
\n\nالعمل مع قواعد البيانات على TypeScript كان لفترة طويلة بمثابة حل وسط. كان TypeORM ضخمًا، Sequelize بطيئًا، و Knex غير مقيد بالأنواع بشكل كافٍ. Prisma غير قواعد اللعبة.
\n\nكيف يعمل Prisma؟
\n\nبدلاً من كتابة النماذج في الكود، تصف مخطط البيانات في ملف خاص schema.prisma. Prisma يولد عميل TypeScript مع دعم كامل للأنواع.
// schema.prisma\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n name String?\n posts Post[]\n createdAt DateTime @default(now())\n}\n\nmodel Post {\n id Int @id @default(autoincrement())\n title String\n content String?\n published Boolean @default(false)\n author User @relation(fields: [authorId], references: [id])\n authorId Int\n}\n\n// الاستخدام في الكود\nimport { PrismaClient } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n\n// استعلامات مقيدة بالأنواع بالكامل\nasync function getUsersWithPosts() {\n const users = await prisma.user.findMany({\n include: {\n posts: {\n where: { published: true },\n select: { title: true, createdAt: true },\n },\n },\n orderBy: { createdAt: 'desc' },\n });\n\n // users — مصفوفة بأنواع صحيحة\n users.forEach(user => {\n console.log(user.email, user.posts.length);\n });\n}\n\nPrisma تلقائيًا