“Funzioni” private in TypeScript

È ansible creare una “funzione” privata (metodo) all’interno di una class TypeScript? Supponiamo di avere il seguente file Person.ts :

 class Person { constructor(public firstName: string, public lastName: string) { } public shout(phrase: string) { alert(phrase); } private whisper(phrase: string) { console.log(phrase); } } 

Che al momento della compilazione viene trasformato in:

 var Person = (function () { function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } Person.prototype.shout = function (phrase) { alert(phrase); }; Person.prototype.whisper = function (phrase) { console.log(phrase); }; return Person; })(); 

osservazioni

Mi aspettavo che la funzione whisper venisse dichiarata all’interno della chiusura, ma non sul prototipo? Essenzialmente questo rende pubblica la funzione whisper una volta compilato?

Le parole chiave pubbliche / private di TypeScript si applicano solo al modo in cui TypeScript controlla il codice: non hanno alcun effetto sull’output di JavaScript.

Secondo le specifiche della lingua (pagine 9-10):

La visibilità privata è un costrutto in fase di progettazione; viene applicato durante il controllo del tipo statico ma non implica alcuna applicazione runtime. … TypeScript impone l’incapsulamento dell’implementazione in classi in fase di progettazione (limitando l’utilizzo di membri privati), ma non può imporre l’incapsulamento in fase di esecuzione poiché tutte le proprietà dell’object sono accessibili in fase di runtime. Le versioni future di JavaScript potrebbero fornire nomi privati ​​che consentirebbero l’applicazione runtime di membri privati

Questo è già stato chiesto e ha risposto qui: https://stackoverflow.com/a/12713869/1014822

Aggiornamento: questa vecchia risposta riceve ancora una quantità di traffico, quindi vale la pena notare che, oltre al collegamento delle specifiche della lingua sopra, i membri pubblici, privati ​​e (ora) protetti sono trattati in dettaglio nel capitolo del manuale di TypeScript sulle classi.

2018 L’ implementazione dell’aggiornamento dei campi privati ​​ES è ora un elemento futuro sulla RoadMap TypeScript sebbene la discussione suggerisca che questa sarà un’opzione privata privata parallela, non una sostituzione dell’attuale implementazione privata soft.

In Javascript (al contrario di TypeScript), non è ansible avere una funzione privata “membro”.

Se si definisce una funzione privata nella chiusura, non sarà ansible chiamarla come metodo di istanza su un’istanza della class.

Se è quello che vuoi, sposta la definizione della funzione TypeScript all’esterno del corpo della class.