Le proprietà di una classe TypeScript sono accessibili in lettura e scrittura per impostazione predefinita, come avviene anche per JavaScript. Tuttavia, in determinate situazioni vorremmo poter controllare l'accesso alle proprietà sia per effettuare eventuali controlli prima dell'assegnamento di un valore, sia per impedire ad esempio l'accesso in scrittura. Consideriamo il seguente esempio:
class Persona {
nome: string;
cognome: string;
nomeCompleto: string;
constructor(nome, cognome) {
this.nome = nome;
this.cognome = cognome;
this.nomeCompleto = nome + ' ' + cognome;
}
}
Abbiamo aggiunto alla classe Persona
la proprietà nomeCompleto
che contiene la concatenazione del valore delle proprietà nome
e cognome
. Naturalmente nell'intenzione dello sviluppatore il valore di questa nuova proprietà dovrebbe essere sincronizzato con il valore delle due proprietà da cui dipende. Ma dal momento che la proprietà nomeCompleto
è liberamente accessibile in lettura e scrittura, è possibile assegnare un valore che non corrisponde alla concatenazione di nome
e cognome
.
get
Per ottenere il comportamento desiderato possiamo definire la proprietà in sola lettura sfruttando l'accessor get, come avviene anche per le classi ECMAScript 6.
class Persona {
nome: string;
cognome: string;
constructor(nome, cognome) {
this.nome = nome;
this.cognome = cognome;
}
get nomeCompleto(): string {
return this.nome + ' ' + this.cognome;
}
}
In questo caso non avremo modo di modificare direttamente la proprietà nomeCompleto
in quanto è in sola lettura ed il suo valore è direttamente calcolato dalle proprietà nome
e cognome
.
var marioRossi = new Persona("Mario", "Rossi");
console.log(marioRossi.nomeCompleto); //Mario Rossi
marioRossi.nomeCompleto = "Giuseppe Verdi";
console.log(marioRossi.nomeCompleto); //Mario Rossi
set
Possiamo consentire la modifica di una proprietà tramite l'accessor set
potendo in questo modo controllare la logica di assegnamento dei valori. Ad esempio, potremmo consentire l'accessibilità in scrittura della nostra proprietà nomeCompleto
facendo in modo che il valore assegnato vada a modificare i valori di nome
e cognome
:
class Persona {
nome: string;
cognome: string;
constructor(nome, cognome) {
this.nome = nome;
this.cognome = cognome;
}
get nomeCompleto(): string {
return this.nome + ' ' + this.cognome;
}
set nomeCompleto(valore: string) {
var parti = valore.toString().split(' ');
this.nome = parti[0] || '';
this.cognome = parti[1] || '';
}
}
Come possiamo vedere dall'esempio, assumendo che nome e cognome siano separati da uno spazio, assegniamo la prima parte del nome completo alla proprietà nome
e la seconda parte alla proprietà cognome
. Assegnando quindi un valore alla proprietà nomeCompleto
otterremo quanto mostrato dal seguente esempio:
var marioRossi = new Persona('Mario', 'Rossi');
console.log(marioRossi.nomeCompleto); //Mario Rossi
marioRossi.nomeCompleto = 'Giuseppe Verdi';
console.log(marioRossi.nomeCompleto); //Giuseppe Verdi
console.log(marioRossi.nome); //Giuseppe
console.log(marioRossi.cognome); //Verdi