لماذا أصبح TypeScript هو المعيار الجديد، وأين تبحث عن أفضل كود؟
\n\nإذا كنت تكتب بلغة JavaScript ولم تنتقل بعد إلى TypeScript، فأنت تهدر وقتك. بجدية. TypeScript (أو TS) ليس مجرد "إضافة" فوق JS. إنه كتابة صارمة للأنواع، وإكمال تلقائي، وإعادة هيكلة دون خوف من كسر كل شيء، وبالطبع كود مفتوح المصدر يمكن (ويجب) دراسته.
\n\nفي هذه المقالة، لن نشرح كيفية تثبيت TypeScript. بدلاً من ذلك، سنذهب إلى GitHub ونستعرض أفضل 7 مستودعات لا تعرض حلولاً جميلة فحسب، بل ستساعدك أيضاً على كتابة كود أكثر نظافة وأماناً وقابلية للتوسع. كل مشروع هو كتاب دراسي مكتوب بكود حقيقي.
\n\nما الذي نبحث عنه في المستودعات؟
\n\n- \n
- أنماط معمارية — كيفية بناء مشروع بحيث لا ترغب في حذفه بعد شهر. \n
- أمثلة على الكتابة الصارمة للأنواع — حيث يظهر TS نفسه بنسبة 100%. \n
- فائدة حقيقية — مكتبات يمكنك تطبيقها الآن. \n
هيا بنا!
\n\n1. NestJS — إطار عمل للتطبيقات الجادة
\n\nالمستودع: github.com/nestjs/nest
\n\nNestJS هو بلا شك أكثر إطارات العمل أناقة على TypeScript. يستعير أفكاراً من Angular (الوحدات، المزينات، حقن التبعيات) ويحول كود الخادم إلى عمل فني.
\n\nلماذا يستحق الدراسة:
\n- \n
- تقسيم واضح إلى وحدات. \n
- دعم مدمج لـ GraphQL و WebSockets و RabbitMQ. \n
- التوثيق هو نموذج يُحتذى به. \n
مثال كود من المستودع (وحدة التحكم والخدمة):
\n\n// cats.controller.ts\nimport { Controller, Get, Post, Body } from '@nestjs/common';\nimport { CatsService } from './cats.service';\nimport { CreateCatDto } from './dto/create-cat.dto';\nimport { Cat } from './interfaces/cat.interface';\n\n@Controller('cats')\nexport class CatsController {\n constructor(private catsService: CatsService) {}\n\n @Post()\n async create(@Body() createCatDto: CreateCatDto) {\n this.catsService.create(createCatDto);\n }\n\n @Get()\n async findAll(): Promise<Cat[]> {\n return this.catsService.findAll();\n }\n}\n\n\nلاحظ المزينات @Controller و @Get والواجهة الصارمة Cat. هذا ليس مجرد كود، بل هو قالب تُبنى عليه مئات الآلاف من المشاريع.
2. Prisma — ORM لا يزعج
\n\nالمستودع: github.com/prisma/prisma
\n\nPrisma هو ORM (تعيين الكائنات العلائقية) حديث لـ TypeScript و Node.js. يقوم بتوليد الأنواع تلقائياً بناءً على مخطط قاعدة البيانات الخاص بك. هذا يعني أن خطأ "الحقل غير موجود" سيتم اكتشافه في مرحلة التجميع، وليس في وقت التشغيل.
\n\nما ستتعلمه: نهج "المخطط أولاً" والتوليد التلقائي للأنواع.
\n\nمثال من التوثيق:
\n\n// schema.prisma\nmodel User {\n id Int @id @default(autoincrement())\n email String @unique\n name String?\n posts Post[]\n}\n\nmodel Post {\n id Int @id @default(autoincrement())\n title String\n content String?\n author User @relation(fields: [authorId], references: [id])\n authorId Int\n}\n\n// usage.ts\nimport { PrismaClient } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n\nasync function main() {\n const user = await prisma.user.create({\n data: {\n email: 'alice@prisma.io',\n name: 'Alice',\n posts: {\n create: { title: 'Hello World' },\n },\n },\n });\n console.log(user);\n}\n\n\nPrisma هو مثال مثالي لكيفية جعل TypeScript العمل مع البيانات آمناً وسريعاً.
\n\n