هذه ترجمة للصفحة الأصلية بالإنجليزية. عند وجود أي اختلاف، تُعتمد النسخة الإنجليزية.
العملاء مكتوبو الأنواع
يوفّر DaloyJS طريقتين اثنتين لاستدعاء واجهتك البرمجية بأمان أنواع كامل. استخدم ما يناسب المستهلك لديك.
1. العميل مكتوب الأنواع داخل العملية (دون توليد شيفرة)
لمستهلكي TypeScript في المستودع الأحادي نفسه (الاختبارات، والأدوات الداخلية، وإجراءات الخادم في Next.js):
يُفهرس العميل حسب operationId، ويعيد اتحادًا مميَّزًا من {status, body, headers}، ويستنتج كل شيء من تعريف المسار نفسه. دون خطوة بناء.
معاملات المسار
تُستبدل معاملات المسار بمقطع كامل، فلا يطابق :id أبدًا داخل :idx، وتُرمَّز كل قيمة بالنسبة المئوية في مقطعها الخاص. ومنذ 1.3.7 ترمي الدالة المولَّدة TypeError قبل إرسال أي طلب، عندما يكون المعامل مفقودًا أو فارغًا أو . أو ... فتحليل URL سيحل مقطع النقطة (حتى بصيغة %2E%2E) ويغيّر هدف الاستدعاء بصمت، فيحوّل مثلًا DELETE /orgs/:org/members/.. إلى DELETE /orgs/:org. وتقبل مسارات أحرف البدل (*path، أو * مجرد باسم wildcard) قيمة مفصولة بـ /؛ ويُرمَّز كل مقطع ويُفحص بالطريقة نفسها.
2. SDK مع Hey API (عبر اللغات والمستودعات، وقت البناء)
للمستهلكين خارج المستودع الأحادي أو بلغات أخرى، ولّد SDK لـ fetch مكتوب الأنواع بالكامل باستخدام @hey-api/openapi-ts.
- 01المساراتapp.route(...)
- 02generateOpenAPI@daloyjs/core/openapi
- 03openapi.jsonمواصفة OpenAPI 3.1 على القرص
- 04openapi-tsمولّد Hey API
- 05SDK مكتوب الأنواعsdk.gen.ts · types.gen.ts
- 06المستهلكاستدعاءات fetch مكتوبة الأنواع بالكامل
استخدام SDK المولَّد
أيهما أستخدم؟
| حالة الاستخدام | الاختيار |
|---|---|
| مستدعٍ بلغة TypeScript في المستودع نفسه (الاختبارات، الأدوات الداخلية) | createInProcessClient |
| تطبيق ويب أو حزمة React Native للهاتف في مستودع منفصل | SDK مع Hey API |
| مستهلك بغير TypeScript (Python، Swift، Kotlin) | مستند OpenAPI + المولّد الذي يفضّلونه |
| SDK عام لأطراف ثالثة | SDK مع Hey API، منشور كحزمة مستقلة |
قادم من ts-rest؟
ts-rest مكتبة شائعة قائمة على العقود تمنحك أنواع TypeScript متكاملة دون توليد شيفرة عبر مشاركة عقد (initContract) بين خادم قائم على المحوّلات (Express، Fastify، NestJS، Next.js) وعميل fetch (initClient). إن كنت تحب هذا النموذج، فسيبدو DaloyJS مألوفًا، مع فرقين.
أولًا، في DaloyJS تعريف المسار هو العقد، فلا يوجد كائن عقد منفصل يجب إبقاؤه متزامنًا. ويمنح createClient داخل العملية الموضح أعلاه التجربة نفسها دون توليد شيفرة ومع أنواع مشتركة لمستدعي TypeScript في المستودع نفسه.
ثانيًا، أمان الأنواع في ts-rest خاص بـ TypeScript ويتطلب أن يستورد العميل العقد. أما DaloyJS فيُصدر مواصفة OpenAPI 3.1 من الدرجة الأولى وSDK مع Hey API من المسارات نفسها، لذا فالمستهلكون الذين لا يستطيعون استيراد أنواعك (مستودعات أخرى، لغات أخرى، حزم SDK عامة) مشمولون أيضًا. في ts-rest، يُعد OpenAPI إضافة اختيارية (@ts-rest/open-api). وDaloyJS هو أيضًا الخادم وبيئة التشغيل نفسها، قابل للنقل عبر Node وBun وDeno وCloudflare وVercel، وليس طبقة أنواع مركّبة على إطار منفصل.
| ts-rest | DaloyJS | |
|---|---|---|
| مصدر العقد | كائن initContract منفصل | تعريف المسار نفسه |
| عميل مكتوب الأنواع دون توليد شيفرة | نعم (initClient، TypeScript فقط) | نعم (createClient، TypeScript فقط) |
| عملاء عبر اللغات والمستودعات | إضافة OpenAPI (@ts-rest/open-api) | OpenAPI 3.1 + SDK مع Hey API، من الدرجة الأولى |
| الخادم | محوّل على Express / Fastify / NestJS / Next.js | مدمج، وقابل للنقل بين بيئات التشغيل |
| التحقق في وقت التشغيل | Standard Schema (Zod / Valibot / ArkType) | Standard Schema (Zod / Valibot / ArkType / TypeBox) |
| الافتراضيات الأمنية | أحضرها بنفسك | الترويسات وحدود الجسم مفعّلة افتراضيًا؛ وCSRF وتحديد المعدل على بُعد سطر واحد |
تحتاج إلى عقد أكبر للتحقق من مخرجات المولّد لديك؟ استخدم عرض REST الوهمي الكبير (بالإنجليزية) كحالة اختبار ضغط بدلًا من تطبيق تعليمي بسيط.
آخر تحديث: