typescript派生类不能有相同的变量名?

Ang*_*gel 26 typescript

为什么typescript派生类不能有相同的变量名?即使这些成员都是私人的.有没有替代品,或者我做错了什么?

class ClassTS {

    private nom: string = "ClaseTS";

    constructor() {

    }
}

class ClassTSDer extends ClassTS {

    private nom: string = "ClassTS";

    constructor() {
        super();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在用TS练习时发现了这一点.

类'ClassTSDer'错误地扩展了基类'ClaseTS'.类型具有私有属性'nom'的单独声明.ClassTSDer

class ClassTSDer

你可以,使用protected ; 是但如果我不想使用受保护的,我是否必须使用其他名称?

Rya*_*ugh 42

属性必须具有不同的名称.

请记住,在运行时,JavaScript类实例只是对象,而对象只是从键到值的映射.属性名称是键,您不能有两个具有相同名称的不同键.

  • 谢谢你回答,我以为我做错了什么.或许对此有一个保留的词,你的解释简短而且非常有用,谢谢你的时间. (2认同)

tos*_*skv 8

属性必须具有不同的名称.

如果您查看生成的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));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,来自子节点中调用的父节点的任何函数都将导致this.nom具有值"ClassTS"而不是"ClaseTs",正如您对私有属性所期望的那样.

编译器不会抱怨受保护的属性(即使它们生成相同的ES5代码),因为封装的期望不再存在.