Подтвердить что ты не робот

Typescript У производного класса не может быть одно и то же имя переменной?

Почему класс typescript не может иметь одно и то же имя переменной? Даже эти члены являются частными. Есть ли альтернатива этому, или я делаю что-то неправильно?

class ClassTS {

    private nom: string = "ClaseTS";

    constructor() {

    }
}

class ClassTSDer extends ClassTS {

    private nom: string = "ClassTS";

    constructor() {
        super();
    }
}

Я нашел это, практикуя с TS.

Класс "ClassTSDer" неправильно расширяет базовый класс "ClaseTS". Типы имеют отдельные декларации частной собственности "ном". ClassTSDer

класс ClassTSDer

вы можете использовать защищенный; да, но если я не хочу использовать защищенный, мне нужно будет использовать другое имя?

4b9b3361

Ответ 1

Свойства должны иметь разные имена.

Помните, что во время выполнения экземпляры класса JavaScript представляют собой просто объекты, а объекты - это просто сопоставления от ключа к значению. Имена свойств являются ключом, и у вас не может быть двух разных ключей с тем же именем.

Ответ 2

Свойства должны иметь разные имена.

Если вы посмотрите на сгенерированный код ES5, вы увидите, что объявление свойства в дочернем классе с тем же именем, что и частное свойство, так как родитель будет перезаписывать родительский, тем самым нарушая инкапсуляцию.

/**
 * ClassTS
 */
var ClassTS = (function () {
    function ClassTS() {
        this.nom = "ClaseTS";
    }
    ClassTS.prototype.someMethod = function () {
        console.log(this.nom);
    };
    return ClassTS;
}());
/**
 * ClassTSDer
 */
var ClassTSDer = (function (_super) {
    __extends(ClassTSDer, _super);
    function ClassTSDer() {
        _super.call(this);
        this.nom = "ClassTS";
    }
    ClassTSDer.prototype.childMethod = function () {
        _super.prototype.someMethod.call(this);
    };
    return ClassTSDer;
}(ClassTS));

В этом случае для любой функции из родительского элемента, вызванного в дочернем элементе, будет this.nom иметь значение "ClassTS" вместо "ClaseTs", как вы ожидали бы от частной собственности.

Компилятор не жалуется на защищенные свойства (даже при том, что они генерируют тот же код ES5), потому что ожидания инкапсуляции больше не существуют.