如何在typescript接口中正确地重载函数

时间:2016-08-31 06:58:41

标签: typescript

我有以下界面

interface foo1 {
    add(num1: number, num2: number): number;
    subtract(num1: number, num2: number): number;
}

现在我创建一个 foo1

形状的对象
let myFoo1: foo1;

myFoo1.add(5, 6); // OK
myFoo1.subtract(5, 6); // OK

很好,现在我创建了一个新界面,我希望它作为第一个扩展

interface foo2 {
    add(num1: number, num2: number, num3: number): number;
}

现在我创建一个 foo2

形状的新对象
let myFoo2: foo2;

myFoo2.add(5, 6, 7); // OK
myFoo2.subtract(5, 6); // ERROR

基于 foo2 界面上的 myFoo2 让我使用“升级”版本的添加,但现在我无法访问减去功能

这就是我提出的问题

let myFoo2: foo1 & foo2;

myFoo2.add(5, 6, 7); // OK
myFoo2.subtract(5, 6); // OK

现在我可以使用较新版本的添加并访问减去功能

这是做事的正确方法还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以通过使第三个参数可选来扩展foo1,因为您可以将两个三个参数传递给名为add的方法。这使它与继承的add方法兼容。

interface foo1 {
    add(num1: number, num2: number): number;
    subtract(num1: number, num2: number): number;
}

interface foo2 extends foo1 {
    add(num1: number, num2: number, num3?: number): number;
}

然后,您可以访问foo1foo2的所有成员。

var x: foo2;

x.add(1, 2);
x.add(1, 2, 3);
x.subtract(3, 1);

或者,您可以以不同的方式切割界面,以便只显示您想要提供的添加方法:

interface foo {
    subtract(num1: number, num2: number): number;
}

interface foo1 extends foo {
    add(num1: number, num2: number): number;
}

interface foo2 extends foo {
    add(num1: number, num2: number, num3: number): number;
}

现在,foo1foo2都有相同的减法方法,但方法不同add

var x: foo2;

// x.add(1, 2); not allowed now
x.add(1, 2, 3);
x.subtract(3, 1);