TypeScript: view on playground
class A {
protected _name: string = ""
set name(name: string) {
this._name = name
}
get name() {
return this._name
}
}
class B extends A {
protected _name: string = ""
set name(name: string) {
this._name = name + "B"
}
}
在编译的类B中,这将覆盖集合AND的定义:
Object.defineProperty(B.prototype, "name", {
set: function (name) {
this._name = name + "B";
},
enumerable: true,
configurable: true
});
结果是,获取名称在B类上不再起作用:
let b = new B()
b.name = "test"
console.log(b.name) // undefined
有没有办法从A类继承getter?
最佳答案 以下代码适用于TypeScript编译器,没有任何错误:
class A {
protected _name: string = ""
set name(name: string) {
this._name = name
}
get name() {
return this._name
}
}
class B extends A {
// Removed _name declaration here
set name(name: string) {
super["name"] = name + "B" // <=== Using super here
}
get name() {
return super["name"] // <=== And here
}
}
var b = new B();
b.name = "foo";
console.log(b.name); // "fooB"
与@Crowder代码的唯一区别在于,我使用super [“name”]而不是super.name.如果使用super.name,编译器将发出此错误:只能通过’super’关键字访问基类的公共和受保护方法.请注意:TypeScript在发现错误时仍会编译,因此使用super.name也可以正常工作,尽管有错误.