首页 文章

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

提问于
浏览
15

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

class ClassTS {

    private nom: string = "ClaseTS";

    constructor() {

    }
}

class ClassTSDer extends ClassTS {

    private nom: string = "ClassTS";

    constructor() {
        super();
    }
}

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

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

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

2 回答

  • 31

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

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

  • 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));
    

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

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

相关问题