为什么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类实例只是对象,而对象只是从键到值的映射.属性名称是键,您不能有两个具有相同名称的不同键.
属性必须具有不同的名称.
如果您查看生成的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代码),因为封装的期望不再存在.
归档时间: |
|
查看次数: |
13459 次 |
最近记录: |