Estoy tratando de aprender a escribir estrictamente en Typescript.
Definí estas clases:
export abstract class MyAbstractClass<TParam extends MyParamBaseType> { private param: TParam; setInitParams(init: TParam): void { ... } getInitParams(): TParam { .... } } export class MyClass extends MyAbstractClass<AParamType> { private param: AParamType; ... }El problema es que aparece el error "La clase 'MyClass' extiende incorrectamente la clase base 'MyAbstractClass'. Los tipos tienen declaraciones separadas de una propiedad privada 'param'".
No entiendo por qué me sale este error porque el tipo AParamType extiende correctamente MyParamBaseType
¿Puede alguien ayudarme? Gracias por tu ayuda.
La palabra clave private es solo un tiempo de compilación verificado. Esto significa que el param de campo se almacenará en tiempo de ejecución en la instancia de la clase. MyAbstractClass declara que su miembro es privado, por lo que si se le permitiera a MyClass volver a declarar el campo param , terminaría accediendo al mismo campo llamado param en la instancia en tiempo de ejecución, rompiendo la privacidad.
Puede usar los campos de clase privada de ES (con # ). Estos aseguran una gran privacidad incluso en tiempo de ejecución y las colisiones de nombres en la subclase no son un problema ya que cada campo declarado es distinto incluso si comparten el mismo nombre:
type MyParamBaseType = {} export abstract class MyAbstractClass<TParam extends MyParamBaseType> { #param!: TParam; setInitParams(init: TParam): void { } getInitParams(): TParam { return this.#param; } } type AParamType = {} export class MyClass extends MyAbstractClass<AParamType> { #param!: AParamType; } O si desea acceder al mismo campo desde la clase base, podría considerar protected en su lugar:
type MyParamBaseType = {} export abstract class MyAbstractClass<TParam extends MyParamBaseType> { protected param!: TParam; setInitParams(init: TParam): void { } getInitParams(): TParam { return this.param } } type AParamType = {} export class MyClass extends MyAbstractClass<AParamType> { protected param!: AParamType; }