我有以下界面
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
现在我可以使用较新版本的添加并访问减去功能
这是做事的正确方法还是我做错了什么?
答案 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;
}
然后,您可以访问foo1
和foo2
的所有成员。
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;
}
现在,foo1
和foo2
都有相同的减法方法,但方法不同add
。
var x: foo2;
// x.add(1, 2); not allowed now
x.add(1, 2, 3);
x.subtract(3, 1);