Hozzáférés-vezérlés a gépírás osztályokban
Számos programozási nyelv alapértelmezés szerint privátként határozza meg osztályainak tulajdonságait. Ahhoz, hogy a példányon kívülről is elérhetővé váljanak, általában a „public” kulcsszóval kell megjelölnie a releváns tulajdonságokat.
Ugyanez a kulcsszó elérhető a gépírási osztályokban is, de nincs sok hatása, mivel a gépírási osztályok tulajdonságai alapértelmezés szerint nyilvánosak. Ezt a korlátozást a Javascript örökölte, amely nem támogatja az osztályok magántulajdonait. Nos, egészen a közelmúltig.
Privát mezők a Javascriptben?
Igen és nem. Jelenleg a Javascript-osztályokban a magántulajdonságokat meghatározó specifikációra vonatkozó munka tervezete a 3. szakaszban van, ami azt jelzi, hogy a végleges meghatározás elfogadható, de még nem biztos.
A specifikációban javasolt változtatások valóban egyszerűek, és csak kissé módosítják a szintaxist. Ha egy tulajdonságot privátként szeretne megjelölni, egyszerűen előtagozza azt egy hashtaggel. Ez az!
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;
Saját mezők a gépírásban!
Ugyanez a szintaxis vonatkozik a Typescript magántulajdonaira is. A 3.8 verzió óta ezt a funkciót használhatja a példányok tulajdonságaihoz és funkcióihoz való hozzáférés, valamint a statikus mezők jobb ellenőrzéséhez. A szintaxis ugyanaz, mint a Javascript példában.
Egy pillanat, kérem, privát statikus mezők?
Igen, jól olvastad: a statikus változók és a függvények is lehetnek privátok, ami azt jelenti, hogy csak az osztály tagjain belül hívhatók meg. Ezt a funkciót a Typescript 4.3-as verziójával adták hozzá, a motorháztető alatt végzett további változtatásokkal együtt. A 4.3-as verzió dokumentációja szerint a privát osztály tagjai futás közben már valóban privátok, ami azt jelzi, hogy ez a szolgáltatás teljesen lejárt.
Felhívjuk figyelmét, hogy a Typescript a "privát" két különböző változatát támogatja az órákon. Az általánosan ismert a "private" kulcsszóval van ellátva, amely a megjelölt mezőket még a származtatott osztályoktól is hozzáférhetetlenül tartja.
A másik jellemző, amelyet itt bemutatok és új, az úgynevezett "magánnevek" használata. Ugyanaz a szintaxis, mint a Javascript esetében, mivel specifikációjukat JS eredetileg meghatározta. A gépírásban futás közben ellenőrzik a hozzáférést.
/**
* 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();
Utolsó szavak az utolsó fejezethez
Ez a cikk nem túl hosszú, de rávilágít a Typescript által kínált nagyszerű szolgáltatásra, valamint magának a Typescriptnek egy általánosabb előnyére. A Javascript esetében a magántulajdonok még mindig vázlatok (bár nagyon késői szakaszban vannak), de a Typescript esetében már megvalósításra és szállításra kerül sor, ami megmutatja ennek a nyelvnek a fejlődési sebességét!