在下面的示例中(Typescript,1.7 +),我需要更改哪些内容才允许B.callback
拥有与A.callback
不同的签名?
class A {
callback(result: number) {
}
}
class B extends A {
callback(result: number, option: number) {
}
}
目前,这会提供test.ts(7,7): error TS2415: Class 'B' incorrectly extends base class 'A'.
在现实世界中,我的示例更复杂,但我可以动态地(或多或少)保证(基于某些配置)所请求的参数将存在。
答案 0 :(得分:5)
根据具体情况,以下解决方案也可能就足够了:
class A {
callback(result: number) {
}
}
class B extends A {
callback(result: number, option?: number) { // make 'option' optional
}
}
答案 1 :(得分:3)
永远不会允许这样做。您需要符合基类函数签名,因为它的多态101 :
class A {
callback(result: number) {
}
}
class B extends A {
callback(result: number, option?: number) {
}
}
// Reason
var b = new B();
var a:A = b; // okay as its a subclass
a.callback(123); // If b didn't have that optional B.callback can blow up
答案 2 :(得分:0)
我怀疑在TypeScript 1.6和即将发布的1.7中这是不可能的。为B.callback()
添加新名称,或将参数添加为A.callback()
中的可选参数。
从传统的OOP角度来看,感觉有点不对,即C#,Java。一个人不应该改变重写方法中的参数数量。对类A
的引用能够保存类B
对象。如果B
向方法添加了非可选参数,则通过A
引用调用该方法将失败。这将由编译器引发错误。
答案 3 :(得分:0)
经过一番来回,我认为目前最好的解决方案是:
class A {
callback(result: number, ...rest: any[]) {
}
}
class B extends A {
callback(result: number, option: number) {
}
}