التحكم في الوصول في فئات Typescript
تحدد العديد من لغات البرمجة خصائص فئاتها على أنها خاصة بشكل افتراضي. لتسهيل الوصول إليها من خارج المثيل ، يتعين عليك عادةً تمييز الخصائص ذات الصلة بالكلمة الأساسية "عام".
تتوفر نفس الكلمة الرئيسية أيضًا في فئات Typescript ، ولكن ليس لها تأثير كبير ، حيث تكون الخصائص في فئات Typescript عامة بشكل افتراضي. هذا القيد موروث من Javascript ، والتي لا تدعم الخصائص الخاصة في الفئات. حسنًا ، حتى وقت قريب.
المجالات الخاصة في جافا سكريبت؟
نعم و لا. حاليًا ، توجد مسودة عمل لمواصفات تحدد الخصائص الخاصة في فئات Javascript في المرحلة 3 ، مما يشير إلى أن التعريف النهائي مقبول ، ولكن لم يتم التأكد بعد.
التغييرات المقترحة في المواصفات بسيطة حقًا ولا تقوم إلا بتعديل بناء الجملة بشكل طفيف. لتمييز خاصية على أنها خاصة ، ما عليك سوى إضافة علامة تصنيف إلى بادئة. هذا هو!
class User {
// A prop marked as private.
#id;
age;
constructor(age){
this.age = age;
// Valid assignment, as we're
// within the class.
this.#id = Math.floor(Math.random() * 1000);
}
}
// ... Later in the code ...
const user = new User(42);
// Error! Won't work as it's private.
user.#id = 123;
الحقول الخاصة في التنصيب!
ينطبق نفس بناء الجملة على الخصائص الخاصة في Typescript. منذ الإصدار 3.8 ، يمكنك استخدام هذه الميزة للتحكم بشكل أفضل في الوصول إلى الخصائص والوظائف للمثيلات بالإضافة إلى الحقول الثابتة. الصيغة هي نفسها كما في مثال Javascript.
لحظة واحدة من فضلك ، الحقول الثابتة الخاصة؟
نعم ، لقد قرأت بشكل صحيح: يمكن أن تكون المتغيرات الثابتة والوظائف خاصة أيضًا ، مما يعني أنه لا يمكن استدعاؤها إلا داخل أعضاء الفصل. تمت إضافة هذه الميزة مع Typescript الإصدار 4.3 ، جنبًا إلى جنب مع المزيد من التغييرات تحت الغطاء. وفقًا لوثائق الإصدار 4.3 ، أصبح أعضاء الفصل الخاص الآن يتمتعون بالخصوصية حقًا في وقت التشغيل ، مما يشير إلى أن هذه الميزة قد نضجت تمامًا.
يرجى ملاحظة أن Typescript يدعم نوعين مختلفين من "private" للفصول الدراسية. الأكثر شيوعًا هو باستخدام الكلمة الأساسية "خاص" ، مما يجعل الحقول المحددة غير قابلة للوصول حتى من الفئات المشتقة.
الميزة الأخرى ، وهي الميزة الجديدة التي أعرضها هنا ، هي استخدام ما يسمى "الأسماء الخاصة". إنها نفس صيغة Javascript ، حيث تم تعريف مواصفاتها بواسطة JS في الأصل. في Typescript ، يتحكمون في الوصول أثناء وقت التشغيل.
/**
* A class that uses already known
* private props.
*/
class CommonUser {
// Common 'private' prop in TS.
private id: number;
age: number;
constructor(age: number){
this.age = age;
this.id = Math.floor(Math.random() * 1000);
}
}
/**
* Using the new sytanx for private class names.
*/
class SpecialUser {
#id: number;
age: number;
constructor(age: number){
this.age = age;
// Valid, we're inside the class.
this.#id = SpecialUser.#generateId();
}
static #generateId(){
return Math.floor(Math.random() * 1000);
}
#stringifyId(){
return this.#id.toString();
}
}
// ... Later in the code ...
// Invalid, call is outside of class 'SpecialUser'.
SpecialUser.#generateId();
const user = new SpecialUser(42);
// And that won't work as well.
user.#stringifyId();
الكلمات الأخيرة للفصل الأخير
هذه المقالة ليست طويلة جدًا ولكنها تسلط الضوء على ميزة رائعة يقدمها Bynnsscript الآن بالإضافة إلى فائدة عامة أكثر لـ Typescript نفسها. بالنسبة لجافا سكريبت ، لا تزال الخصائص الخاصة عبارة عن مسودة (وإن كانت في مرحلة متأخرة جدًا) ، ولكن تم بالفعل تنفيذها وشحنها بالنسبة إلى "نسخة سكريبت" ، مما يوضح السرعة التي تتطور بها هذه اللغة!