javascript - Cum să folosești Object.defineProperty pentru getters în Typescript?


Am folosit o implementare așa cum este prezentată mai jos în JavaScript.

class Base {
    installGetters() {
        Object.defineProperty(this, 'add', {
            get() {
                return 5;
            }
        });
    }
}

class New extends Base {
    constructor() {
        super();
        this.installGetters();
    }

    someAddition() {
        return 10 + this.add;
    }
}

Am definit proprietatea getter add în funcția clasei părinte - Base și am folosit acea proprietate în clasa copil New după ce am apelat funcția installGetters() în constructorul clasei copil. Acest lucru funcționează în JavaScript, dar this.add generează o eroare în cazul TypeScript. Orice ajutor ar fi foarte apreciat.

Motivația mea principală pentru a face acest lucru este că vreau să transmit un obiect către installGetters() astfel încât acesta să poată genera mai mulți getter-i, cu cheile obiectului devenind numele getter-ilor și valorile fiind returnate de funcțiile getter corespunzătoare.

Acesta funcționează în JavaScript, așa că principala mea curiozitate este dacă acest lucru nu este posibil în TypeScript sau dacă fac ceva greșit.

Răspuns #1

Deși acesta este un tipar destul de ciudat, voi oferi un răspuns la întrebarea ta reală.

TypeScript nu este suficient de inteligent pentru a deduce tipul real Base pe baza unei metode apelate pe constructorul unei subclase, așa că trebuie să îl declari:

declare readonly add: number;

Loc de joacă TypeScript

Răspunsul #2

După ce am aplicat moștenirea, aș sugera utilizarea protected:

Membrii protejați sunt vizibili doar pentru subclasele clasei în care sunt declarați.

class Base {
  protected add!: number;
  installGetters() {
    this.add = 5;
  }
}

Problemă legată de problema ta: https://github.com/microsoft/TypeScript/issues/28694