以下是一个例子:
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 :修复了代码,意外使用了函数属性而不是方法。
答案 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;
}());