给出
class BaseClass{
count:number=0;
public someMethod=():void =>{
this.count++;
}
}
class ChildClass extends BaseClass{
public someMethod=():void=>{
super.someMethod();
//Do more work here.
}
}
我收到错误消息:
只有基类的公共方法可以通过' super' 关键字。
@Basarat在这里提供了一些信息,但这似乎是对该语言的真正破解。 typescript arrow operator to define a function on prototype
如何在保留'这个'?的情境使用的同时做到这一点?
我是否正确使用箭头功能,或者它们是否真的只能用作声明回调之类的方法?
答案 0 :(得分:9)
为了争论,假设你
最小的hackish(如果不是优雅)答案是将你的功能分成两个调用来解决这两个问题:
Class A {
public handleScope = () => {
return this.handleInheritance();
}
public handleInheritance() {
// do work
}
}
Class B extends A {
public handleInheritance() {
super.handleInheritance() // super works here
// additional work
}
}
我是第一个承认双重功能是“丑陋”的人,但恕我直言比我见过的其他选项要难得多。为了帮助标准化命名,我将单行“范围”函数命名为基函数的名称(例如myFunction
)加上“Scoper”(即myFunctionScoper
)。这也是IDE友好的,因为当您开始为可继承方法键入名称时,您经常会将Scoper
方法作为提示选项。
答案 1 :(得分:4)
箭头是否正常运行,或者它们是否真的只能用作声明回调之类的方法?
它们应该只用于回调。如果您想要一个类层次结构,那么使用原型。 prototype
也可以节省你的记忆。
强制修复:只有一个this
,它是当前实例。如果覆盖子类中的this.foo
,则基本实例this.foo
将丢失。保留构造函数中的基本版本
class BaseClass{
count:number=0;
public someMethod=():void =>{
this.count++;
}
}
class ChildClass extends BaseClass{
constructor(){
super();
var baseSomeMethod = this.someMethod;
this.someMethod = ()=>{
// implement here
}
}
}
答案 2 :(得分:1)
如果原型中没有函数实现,派生类就无法“找到”基类实现。您可以将其分开,以便您有一种方法可以保留this
,另一种方法可以通过super
使用:
class BaseClass {
count: number = 0;
someMethodImpl() {
this.count++;
}
public someMethod = this.someMethodImpl;
}
class ChildClass extends BaseClass {
public someMethod = (): void=> {
super.someMethodImpl();
//Do more work here.
}
}
答案 3 :(得分:0)
只想捕获一个"答案"来自另一个讨论的这个问题: https://typescript.codeplex.com/workitem/2491
在内存或处理开销方面绝对没有效率,但它确实回答了这个问题。
class Base {
x = 0;
constructor() {
for (var p in this)
if (!Object.prototype.hasOwnProperty.call(this, p) && typeof this[p] == 'function') {
var method = this[p];
this[p] = () => { method.apply(this, arguments); };
// (make a prototype method bound to the instance)
}
}
}
class A extends Base {
doSomething(value) { alert("A: " + value + " / x == " + this.x); }
}
class B extends A {
doSomething(value) { alert("B: " + value + " / x == " + this.x ); super.doSomething(value); }
}
var b = new B();
var callback = b.doSomething;
callback("Cool!");