typescript2.0 - ما معادل نطاق الحزمة في Typescript؟
هل هناك طريقة في TypeScript للسماح لملف واحد بالوصول إلى الطرق في ملف آخر، ولكن دون جعلها متاحة عالميًا؟
حالة الاستخدام لذلك هي وجود فئة كبيرة تحتوي على بعض الطرق الخاصة التي قد تكون خطرة والتي لا ينبغي كشفها علنًا ليتم استخدامها محتملًا في أي مكان في قاعدة الشفرة. أريد أن أكون قادرًا على كتابة الطرق التي تصل إليها في ملف آخر للسماح بتجميعها منطقيًا دون أن تكون كلها في فئة واحدة ضخمة.
من الناحية المثالية، شيء مثل نطاق الحزمة في جافا سيسمح لي بالإعلان أن الملفين يمكنهما الوصول إلى الطرق الخطيرة لبعضهما البعض ولكن لا يمكن لأي شخص آخر ذلك. هل هناك أي ميزة في لغة TypeScript تسمح بهذا؟
مثال :
الفئة A تحتوي على طرق d1 إلى d100 وهي جميعها خطيرة ولا ينبغي أن تكون متاحة على الصعيد العالمي.
الفئة B تحتوي على طرق s1 حتى s100 وهي آمنة للاستخدام العام داخل المشروع. كل طريقة s تستدعي طريقة d بعد إجراء بعض فحوصات الأمان. تحتاج الفئة B إلى الوصول إلى جميع طرق d.
تريد الفئة C استدعاء أي من طرق s ويجب أن تكون قادرة على ذلك، لكن لا يجب أن تكون قادرة على استدعاء أي من طرق d.
ومع ذلك، حسب فهمي لـ Typescript، إذا قمت بتصدير أي من طرق d حتى يتمكن B من استدعائها، فإنها تصبح متاحة لـ C أيضًا. إذا كان هذا في Java، كنت سأضع A و B في نفس الحزمة وأجعل طرق d ضمن نطاق الحزمة.
يبدو أنه لا يوجد أي ما يشابه هذا في TypeScript، لكن هل هناك أي شيء يحاكي أهداف 1) القدرة على تقسيم الوظائف إلى ملفات منفصلة و 2) تحديد من يمكنه استدعاء الطرق؟
(نعم، أعلم أنه بمجرد ترجمته إلى جافاسكريبت، كل التوقعات تلغي. الهدف هو مجرد استخدام تايب سكريبت كأداة لفحص ثابت للتحقق من العقود أثناء وقت الترجمة.)
الإجابة رقم 1
لا توجد طرق مباشرة لفرض هذا في TypeScript. من خلال تجربتي، أفضل طريقة لحل هذا النوع من المشاكل هي من خلال التوثيق الواضح ونماذج التسمية الواضحة.
إذا كان هناك مطور غير ماهر أو خبيث، فسيكون لديه أي عدد من الطرق لإحداث الفوضى، ولن تفعل قيود المترجم الكثير لإيقافهم. ومع ذلك، يجب أن يكون جميع المطورين ذوي المهارة والأخلاق قادرين على تجنب استدعاء الطرق الداخلية والخطيرة.
توصيتي ستكون بإنشاء نوع من تسمية القواعد. يجب أن يكون لجميع الطرق/الخصائص/الحقول غير الخاصة بواجهة برمجة التطبيقات التي هي عامة بسبب قيود اللغة نفس البادئة أو اللاحقة.
على سبيل المثال، طريقة عمل فريقنا هي كالتالي:
- جميع الطرق/الخصائص/الحقول العامة غير المتعلقة بواجهة برمجة التطبيقات تحتوي على بادئة
_. - جميع الفئات العامة غير المتعلقة بـ API تُضاف إليها اللاحقة
Internal. - جميع الوحدات غير المتعلقة بـ API موجودة في مجلد
internal. على سبيل المثال،src/modelsيحتوي على وحدات النماذج التي هي API.src/models/internalيحتوي على وحدات النماذج التي ليست API. - جميع الفئات غير المتعلقة بواجهة برمجة التطبيقات تحتوي على تعليق يوثقها كغير متعلقة بواجهة برمجة التطبيقات.
أيضًا، لم نقم بذلك بعد، لكننا نفكر في إنشاء قواعد tslint للمساعدة في تطبيق هذه القواعد. لم نذهب بعيدًا في هذا الطريق بعد لأننا لم نواجه أي مطورين يستخدمون غير واجهة برمجة التطبيقات عن طريق الخطأ، لكن هذا لا يزال احتمالًا.
في رأيي، التسمية الصحيحة، والوثائق الصحيحة، والإشراف الصحيح تكفي لحل هذه المشكلة، والتي أوافق على أنها قيد في لغة تايب سكريبت.
الإجابة رقم 2
يبدو أن استخدام مساحة اسم مقسمة عبر ملفات سيحقق ذلك بشكل جيد:
https://www.typescriptlang.org/docs/handbook/namespaces.html#splitting-across-files
كما هو الحال مع هذا في ملف MyNamespace.ts:
namespace MyNamespace {
export interface Foo {}
}
ونفس مساحة الأسماء بالإضافة إلى وسم المرجع في ملف آخر:
/// <reference path="MyNamespace.ts" />
namespace MyNamespace {
export class Bar implements Foo {}
}
