网站搜索

如何扩展 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));
}

但也许有一种更优雅的方式……