He usado una implementación como se indica a continuación en JavaScript.
class Base { installGetters() { Object.defineProperty(this, 'add', { get() { return 5; } }); } } class New extends Base { constructor() { super(); this.installGetters(); } someAddition() { return 10 + this.add; } } Definí la propiedad getter add en la función de la clase principal - Base y usé esa propiedad en la clase secundaria New después de llamar a la función installGetters() en el constructor de la clase secundaria. Esto funciona para JavaScript, pero this.add arroja un error en el caso de Typescript. Cualquier ayuda sería muy apreciada.
Mi principal motivación para hacer esto es que quiero pasar un objeto a installGetters() para que pueda generar múltiples getters con las claves de objeto como nombres de getter y los valores devueltos por las funciones de getter correspondientes.
Esto funciona en JavaScript, por lo que mi principal curiosidad es si esto no es posible en TypeScript o si estoy haciendo algo mal.
Aunque este es un patrón bastante extraño, proporcionaré una respuesta a su pregunta real.
TypeScript no es lo suficientemente inteligente como para inferir el tipo Base real en función de un método llamado en un constructor de subclase, por lo que debe declare :
declare readonly add: number;Habiendo aplicado la herencia, sugeriría usar protected :
los miembros protegidos solo son visibles para las subclases de la clase en la que están declarados.
class Base { protected add!: number; installGetters() { this.add = 5; } }Problema relacionado con su problema: https://github.com/microsoft/TypeScript/issues/28694
La razón de esto es probable que TypeScript no sepa sobre el captador que agregó. No hay que escribir mecanografiado que indique que este captador existe y el mecanografiado no puede saber mágicamente que agregó la función de captador y cómo se vería. O define el getter en la clase base o, en caso de que esto no sea posible, probablemente no haya otra forma que convertir esto en cualquiera.
someAddition() { return 10 + (this as any).add }