Получатель Typescript возвращает неопределенное значение, хотя частное свойство установлено - PullRequest
3 голосов
/ 13 июня 2019

Я пробовал этот код с TypeScript 2.6 и 3.4:

abstract class Base {
    private _prop = false;
    public get prop() { return this._prop; }
    public setProp(v) { this._prop = v; }

    private _otherProp = false;
    public get otherProp() { return this._otherProp; }
    public set otherProp(v) { this.setOtherProp(v); }    
    public setOtherProp(v) { this._otherProp = v; }
}

class MyBase extends Base {
    public set prop(v) { this.setProp(v); }
}

const base = new MyBase();

base.setProp(true);
base.setOtherProp(true);

console.log(`prop = ${base.prop}`); // prop = undefined
console.log(`otherProp = ${base.otherProp}`); // otherProp = true

Почему другой результат? Обратите внимание, что если я закомментирую set prop() в классе MyBase, то оба свойства вернут true, однако этот установщик никогда даже не выполняется, так почему же важно, что он там есть?

Запустите код самостоятельно (результаты в консоли)

1 Ответ

0 голосов
/ 14 июня 2019

Вы не можете переопределить только set свойства, вы переопределяете все свойство, просто вы оставляете get неопределенным. Синтаксис get / set - это просто синтаксический сахар для Object.defineProperty, который переопределяет все свойство.

Переопределите get и вызовите super.prop, и все будет работать как положено:

abstract class Base {
    private _prop = false;
    public get prop() { return this._prop; }
    public setProp(v: boolean) { this._prop = v; }

    private _otherProp = false;
    public get otherProp() { return this._otherProp; }
    public set otherProp(v) { this.setOtherProp(v); }    
    public setOtherProp(v: boolean) { this._otherProp = v; }
}

class MyBase extends Base {

    public get prop() { return super.prop; }
    public set prop(v: boolean) { this.setProp(v); }
}

const base = new MyBase();

base.setProp(true);
base.setOtherProp(true);

console.log(`prop = ${base.prop}`); // prop = true
console.log(`otherProp = ${base.otherProp}`); // otherProp = true

Ссылка на игровую площадку

...