multiple - "Funciones" privadas en TypeScript
typescript proxy (2)
¿Es posible crear una "función" privada (método) dentro de una clase de TypeScript? Supongamos que tenemos el siguiente archivo Person.ts
TypeScript:
class Person {
constructor(public firstName: string, public lastName: string) {
}
public shout(phrase: string) {
alert(phrase);
}
private whisper(phrase: string) {
console.log(phrase);
}
}
Que cuando se compila se transforma a lo siguiente:
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;
})();
Observaciones
Esperaba que se declarara la función de whisper
dentro del cierre, pero no en el prototipo. Básicamente, esto hace que la función de whisper
pública cuando se compila?
En Javascript (a diferencia de TypeScript), no puede tener una función privada de "miembro".
Si define una función privada en el cierre, no podrá llamarla como un método de instancia en una instancia de su clase.
Si eso es lo que quiere, simplemente mueva la definición de función de TypeScript fuera del cuerpo de la clase.
Las palabras clave públicas / privadas de TypeScript solo se aplican a la forma en que TypeScript revisa su código: no tienen ningún efecto en el resultado de JavaScript.
De acuerdo con la especificación del idioma (pp. 9-10):
La visibilidad privada es una construcción en tiempo de diseño; se aplica durante la comprobación estática de tipos, pero no implica ninguna ejecución en tiempo de ejecución. ... TypeScript impone la encapsulación de la implementación en clases en tiempo de diseño (al restringir el uso de miembros privados), pero no puede aplicar la encapsulación en el tiempo de ejecución porque todas las propiedades de los objetos están accesibles en el tiempo de ejecución. Las versiones futuras de JavaScript pueden proporcionar nombres privados que permitirían la ejecución de los miembros privados en tiempo de ejecución
Esto ya se ha preguntado y respondido aquí: https://.com/a/12713869/1014822
Actualización: esta vieja respuesta todavía recibe una cantidad de tráfico, por lo que vale la pena señalar que, además del enlace de especificación de idioma anterior, los miembros públicos, privados y (ahora) protegidos están cubiertos en detalle en el capítulo del handbook TypeScript sobre clases.
2018 Actualización La implementación de campos privados de ES ahora es un elemento futuro en TypeScript RoadMap aunque la discussion sugiere que se tratará de una opción privada dura paralela, no un reemplazo de la actual implementación de software privado.