בקרת גישה בשיעורי Typescript
שפות תכנות רבות מגדירות את מאפייני הכיתות שלה כפרטיות כברירת מחדל. כדי להנגיש אותם מחוץ למופע, בדרך כלל עליכם לסמן את המאפיינים הרלוונטיים במילת המפתח "ציבורי".
אותה מילת מפתח זמינה גם בשיעורי Typescript, אך אין לה השפעה רבה, מכיוון שמאפיינים בשיעורי Typescript הם ציבוריים כברירת מחדל. אילוץ זה עובר בירושה מ- Javascript, שאינו תומך בנכסים פרטיים בכיתות. ובכן, עד לאחרונה.
שדות פרטיים ב- Javascript?
כן ולא. נכון לעכשיו, טיוטת עבודה למפרט המגדיר נכסים פרטיים בשיעורי Javascript נמצאת בשלב 3, מה שמעיד על הגדרה סופית סבירה, אך עדיין לא בטוחה.
השינויים המוצעים במפרט הם פשוטים באמת ומשנים מעט את התחביר. כדי לסמן נכס כפרטי, פשוט קידם אותו עם hashtag. זהו זה!
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!
אותו תחביר חל גם על נכסים פרטיים ב- Typescript. מאז גרסה 3.8, אתה יכול להשתמש בתכונה זו כדי לשלוט טוב יותר בגישה למאפיינים ופונקציות למופעים כמו גם לשדות סטטיים. התחביר זהה לזה שבדוגמה של Javascript.
רגע אחד בבקשה, שדות סטטיים פרטיים?
כן, קראת נכון: משתנים סטטיים כמו גם פונקציות יכולים להיות פרטיים, מה שאומר שהם יכולים להיקרא רק בתוך חברי הכיתה. תכונה זו נוספה עם Typescript גרסה 4.3, יחד עם שינויים נוספים מתחת למכסה המנוע. על פי התיעוד לגירסה 4.3, חברי כיתה פרטיים הם כעת פרטיים באמת בזמן ריצה, מה שמעיד על כך שהתכונה הזו הבשילה לחלוטין.
שים לב ש- Typescript תומך בשתי גרסאות שונות של "פרטי" לשיעורים. המוכר בדרך כלל הוא עם מילת המפתח "פרטי", השומרת על נגישות השדות המסומנים אפילו ממעמדות נגזרים.
התכונה האחרת, שהיא התכונה שאני מציג כאן והיא חדשה, היא השימוש במה שמכונה "שמות פרטיים". הם התחביר זהה לזה של 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();
מילים אחרונות לפרק האחרון
מאמר זה לא ארוך במיוחד אך מדגיש תכונה נהדרת ש- Typescript מציע כעת כמו גם יתרון כללי יותר של Typescript עצמו. עבור Javascript, נכסים פרטיים הם עדיין טיוטה (אמנם בשלב מאוחר מאוד), אך עבור Typescript הם כבר מיושמים ונשלחים, מה שמראה את המהירות שבה שפה זו מתפתחת!