在Typescript中更改子类的方法签名?

时间:2015-11-05 10:36:05

标签: typescript typescript1.7

在下面的示例中(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'.

在现实世界中,我的示例更复杂,但我可以动态地(或多或少)保证(基于某些配置)所请求的参数将存在。

4 个答案:

答案 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) {
    }
}