【问题标题】:typescript derived class cannot have the same variable name?打字稿派生类不能有相同的变量名?
【发布时间】:2016-06-13 00:58:37
【问题描述】:

为什么打字稿派生类不能有相同的变量名?甚至这些成员都是私人的。有没有其他选择,还是我做错了什么?

class ClassTS {
    
    private nom: string = "ClaseTS";
    
    constructor() {
            
    }
}

class ClassTSDer extends ClassTS {
    
    private nom: string = "ClassTS";
    
    constructor() {
        super();
    }
}

我在练习 TS 时发现了这个。

“ClassTSDer”类错误地扩展了基类“ClaseTS”。类型 有私有财产“名义”的单独声明。类TSDer

类TSDer

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

【问题讨论】:

  • 不是“虽然”,而是因为有私人你不能有相同的名字。你想覆盖私有属性(与父类具有相同属性的子类总是想要覆盖它)。
  • “你可以使用受保护的” => 我在父子类中将它设置为 public 并不痛苦,它可以工作:D

标签: typescript


【解决方案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”。

编译器不会抱怨 protected 属性(即使它们生成相同的 ES5 代码),因为不再需要封装。

【讨论】:

  • 感谢您的回答,我以为我做错了什么。或者也许有一个保留字,你说......编译器不会抱怨受保护的......我不知道谢谢你的时间
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 2014-12-27
  • 2010-09-29
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
相关资源
最近更新 更多