为什么打字稿派生类不能有相同的变量名?即使这些成员都是私人的。有没有替代方案,或者我做错了什么?
class ClassTS {
private nom: string = "ClaseTS";
constructor() {
}
}
class ClassTSDer extends ClassTS {
private nom: string = "ClassTS";
constructor() {
super();
}
}
我在用TS练习时发现了这一点。
Class'ClassTSDer'错误地扩展了基类'ClaseTS'。类型 有一个私人财产'nom'的单独声明。 ClassTSDer
class ClassTSDer
你可以使用受保护的;是但如果我不想使用受保护的,我是否必须使用其他名称?
答案 0 :(得分:39)
属性必须具有不同的名称。
请记住,在运行时,JavaScript类实例只是对象,而对象只是从键到值的映射。属性名称是键,您不能有两个具有相同名称的不同键。
答案 1 :(得分: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"正如你对私人财产所期望的那样。
编译器不会抱怨受保护的属性(即使它们生成相同的ES5代码),因为封装的期望不再存在。