子类

时间:2016-09-12 23:50:13

标签: typescript

以下是一个例子:

class A {
  func(): void {}
}

class B extends A {
  func(a: number, b: string): void {}
}

B类错误地说func()执行不正确。

最终,我正努力做到这一点:

var b: B;
b.func(0, '');     // func is overloaded by B
b.func();          // func is inherited from A

目前在打字稿中是否可行?

UPDATE :修复了代码,意外使用了函数属性而不是方法。

3 个答案:

答案 0 :(得分:2)

因为TypeScript被编译为Javascript。

JavaScript不知道传递给函数的参数数量,以及每个参数的类型以正确决定自动调用哪个函数。所以你必须使用不同的函数名称。或者你必须在运行时检查参数的实际类型:

class B extends A {
  func() => void;
  func(a: number, b: string) => void;
  func(a: any, b: any) {
    if (a == undefined) {
      super.func()
    } else if (typeof(a) == "number" && typeof(b) == "String") {
      /// implement func(a: b) here
    }
  }

}

答案 1 :(得分:1)

没有办法自动获取基类的过载签名。你需要写这样的东西:

class A {
  func: () => void;
}

class B extends A {
  func: {
      (): void;
      (a: number, b: string): void;
  }
}

正如另一个答案所述,您可以自己正确实施func来处理0-arg案例。

答案 2 :(得分:0)

使用箭头函数时,你并不真正得到类方法,而是函数类型/值的成员 不同之处在于,当方法被添加到原型时,箭头函数被添加到constrctor中的实例中:

"Total"

编译为:

class MyClass {
    method() {}
    funct = () => {}
}

当然,这很好,如果这就是你想要的 主要的问题是重载和调用父方法并不那么简单。

在您的情况下,重载:

var MyClass = (function () {
    function MyClass() {
        this.func = function () { };
    }
    MyClass.prototype.method = function () { };
    return MyClass;
}());