如何扩展 Typescript 接口?
例如,我有一个接口:
interface Foo {
value1: number;
value2: number;
}
我想添加一个 sum() 方法,它可以给我这个接口的任何实例的值的总和。TypeScript 有什么方法可以做到这一点?
我需要能够编写像这样的函数:
function printFooSum(foo: Foo) {
console.log(???);
}
并且该函数不应涉及将 foo 属性手动分配给其他类。
答案#1
通过 extends 关键字扩展 TypeScript 接口:
interface Foo {
value1: number;
value2: number;
}
interface Bar extends Foo {
sum() : number;
}
按以下方式实现接口:
class Baz implements Bar {
public value1: number;
public value2: number;
sum() : number { return this.value1 + this.value2; }
}
var bar : Bar = new Baz();
注意:implements Bar 部分是可选的。Baz 的实例仍然可以赋值给 Bar 类型,因为它们拥有所需的属性。然而,添加 implements Bar 会强制编译器检查 Baz 类是否实现了 Bar 接口,如果没有,则在 Baz 上抛出编译时错误。
答案#2
一种做法如下:
interface Foo {
value1: number;
value2: number;
}
class Foo {
public static sum(foo: Foo) {
return foo.value1 + foo.value2;
}
}
function printFooSum(foo: Foo) {
console.log(Foo.sum(foo));
}
但也许有一种更优雅的方式……
