Proprietà delle classi private dattiloscritte

Typescript supporta le proprietà private per le classi

Controllo degli accessi nelle classi Typescript

Molti linguaggi di programmazione definiscono le proprietà delle sue classi come private per impostazione predefinita. Per renderli accessibili dall'esterno dell'istanza, in genere devi contrassegnare le proprietà pertinenti con la parola chiave "pubblico".

La stessa parola chiave è disponibile anche nelle classi Typescript, ma non ha un grande impatto, poiché le proprietà nelle classi Typescript sono pubbliche per impostazione predefinita. Questo vincolo è ereditato da Javascript, che non supporta le proprietà private nelle classi. Beh, fino a poco tempo fa.

Campi privati in Javascript?

Sì e no. Attualmente, una bozza di lavoro per una specifica che definisce le proprietà private nelle classi Javascript è nella fase 3, il che indica che una definizione finale è plausibile, ma non ancora sicura.

Le modifiche proposte nelle specifiche sono davvero semplici e modificano solo leggermente la sintassi. Per contrassegnare una proprietà come privata, è sufficiente prefiggerla con un hashtag. Questo è tutto!

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;

Campi privati in Typescript!

La stessa sintassi si applica alle proprietà private in Typescript. Dalla versione 3.8, è possibile utilizzare questa funzionalità per controllare meglio l'accesso a proprietà e funzioni per istanze e campi statici. La sintassi è la stessa dell'esempio Javascript.

Un momento per favore, campi statici privati?

Sì, hai letto bene: anche le variabili statiche e le funzioni possono essere private, il che significa che possono essere chiamate solo all'interno dei membri della classe. Questa funzionalità è stata aggiunta con la versione 4.3 di Typescript, insieme a ulteriori modifiche sotto il cofano. Secondo la documentazione per la versione 4.3, i membri della classe privata ora sono veramente privati in fase di esecuzione, il che indica che questa funzionalità è completamente matura.

Si prega di notare che Typescript supporta due diverse varianti di "privato" per le classi. Quello comunemente noto è con la parola chiave "privato", che mantiene i campi contrassegnati inaccessibili anche dalle classi derivate.

L'altra caratteristica, che è quella che sto mostrando qui e che è nuova, è l'uso dei cosiddetti "nomi privati". Sono la stessa sintassi di Javascript, poiché la loro specifica è stata originariamente definita da JS. In Typescript, controllano l'accesso durante il runtime.

/**
 * 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();

Ultime parole per l'ultimo capitolo

Questo articolo non è molto lungo ma mette in evidenza una grande funzionalità che Typescript offre ora e un vantaggio più generale di Typescript stesso. Per Javascript, le proprietà private sono ancora una bozza (anche se in una fase molto avanzata), ma per Typescript sono già implementate e spedite, il che mostra la velocità con cui questo linguaggio si sta evolvendo!