variable method clases array and typescript setter getter-setter accessor

clases - typescript static method



Mecanografiado privado (2)

¿Hay alguna manera de tener un setter privado para una propiedad en TypeScript?

class Test { private _prop: string; public get prop() : string { return this._prop; } private set prop(val: string) { //can put breakpoints here this._prop = val; } }

El compilador se queja de que la visibilidad para getter y setter no coincide. Sé que solo puedo establecer el campo de respaldo, pero no puedo establecer puntos de interrupción cuando se establece el valor.

Pensé en usar una interfaz para ocultar el setter, pero las interfaces solo pueden definir una propiedad, no si tiene un getter en setter.

¿Me estoy perdiendo de algo? Parece que no hay ninguna razón para no permitir que los configuradores privados, el JS resultante no impone la visibilidad de todos modos, y parece mejor que las alternativas actuales.

¿Me estoy perdiendo de algo? Si no es así, ¿hay una buena razón para no tener setters privados?


La especificación TypeScript (8.4.3) dice ...

Los accesores para el mismo nombre de miembro deben especificar la misma accesibilidad

Por lo tanto, debe elegir una alternativa adecuada. Aquí hay dos opciones para usted:

Simplemente no puede tener un setter, lo que significa que solo la clase Test puede establecer la propiedad. Puede colocar un punto de interrupción en la línea this._prop =...

class Test { private _prop: string; public get prop() : string { return this._prop; } doSomething() { this._prop = ''I can set it!''; } } var test = new Test(); test._prop = ''I cannot!'';

Probablemente, la forma ideal de garantizar que el acceso privado resulte en algo similar a un patrón de "notificación de cambio de propiedad" que se puede implementar es tener un par de accesos privados de propiedad get / set, y un acceso público separado de propiedad get.

Aún debe ser cauteloso acerca de que alguien más tarde agregue una llamada directa al campo de respaldo. Podrías ser creativo en esa área para tratar de hacerlo menos probable.

class Test { private _nameBackingField: string; private get _name() : string { return this._nameBackingField; } private set _name(val: string) { this._nameBackingField = val; // other actions... notify the property has changed etc } public get name(): string { return this._name; } doSomething() { this._name += ''Additional Stuff''; } }


También espero que podamos tener público getter y privado setter. Hasta que lo hagamos, otra forma de manejar esto es agregar getter y setter privado adicional:

class Test { _prop: string; public get prop(): string { return this._prop; } private get internalProp(): string { return this.prop; } private set internalProp(value: string) { this._prop = value; } private addToProp(valueToAdd: string): void { this.internalProp += valueToAdd; } }