Saltar al contenido

propiedades de solo lectura y ngOnInit

Sé libre de compartir nuestra web y códigos con otro, apóyanos para ampliar nuestra comunidad.

Solución:

Las propiedades de solo lectura solo se pueden asignar en el constructor

No true

class MyClass 
  readonly prop1 = 'prop1';
  constructor(
    public readonly prop2 = 'prop2'
  ) 
  

  ngOnInit() 
    Object.defineProperty(this, 'prop3',  wirtable: false, value: 'prop3');
  

Como ves, ya hay 3 formas de definirlos. ¡Y probablemente más!

pero en angular se desaconseja y, a veces, es imposible usar el constructor para cierta inicialización y, en su lugar, se usa el gancho angular ngOnInit

Es “desaconsejado” para los recién llegados, porque es más fácil decirles que no lo hagan, en lugar de explicarles en profundidad el ciclo de vida del marco. El punto es que puedes usar el constructor como quieras, especialmente para cosas no relacionadas con Angular (como variables de solo lectura).

¿Hay alguna forma de marcar ngOnInit como constructor?

Un constrcutor es un constructor. No puede definir un método para que sea un constructor. Solo puede llamar a un método en el constructor, pero eso no resolverá su problema.

para que pueda usar solo lectura para propiedades esencialmente inmutables que solo se asignan una sola vez en ngOnInit?

Respuesta y conclusión: usa tu constructor como quieras. Ponga sus propiedades de solo lectura si lo desea.

Además, considere proporcionar algún sandbox o al menos algún código, para que podamos hacer una respuesta que se adapte tanto a su código como a sus necesidades.

No puede marcar un método como constructor, simplemente no hay sintaxis para eso. Puedes romper el readonly que es solo una verificación de tiempo de compilación mediante el uso de una afirmación de tipo para any y acceda a cualquier propiedad pública/privada que desee de forma insegura. También puede usar un tipo asignado para hacer que el tipo sea mutable, pero solo funciona para propiedades públicas:

type Mutable =  -readonly [ P in keyof T]: T[P] 

class Foo 
    public readonly data: string;
    private readonly pdata: string;
    public init() 
        const ref: Mutable = this;
        ref.data = "" 
        const pRef = this as any;
        pRef.pdata = ""

        const pSaferRef:  pdata: string  = this as any;
        pSaferRef.pdata = ""
    

¿Por qué no usa un setter y un getter en lugar de readonly?

export class MyComponent 
  private _value: string;
  set value(v: string) 
    if (!this._value) 
      this._value = v;
     else 
      throw new TypeError('Assignment to read-only variable');
    
  

  get value() 
    return this._value;
  

Sección de Reseñas y Valoraciones

Puedes animar nuestra investigación mostrando un comentario o dejando una valoración te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *