如何扩展Typescript接口?

时间:2016-03-29 20:29:44

标签: typescript

例如,我有一个界面:

interface Foo {
  value1: number;
  value2: number;
}

我想添加一个sum()方法,它会在这个接口的任何实例上给出一个值的总和。什么是Typescript的做法?

我需要能够编写这样的函数:

function printFooSum(foo: Foo) {
  console.log(???);
}

并且该函数不应涉及将foo属性手动分配给其他类。

3 个答案:

答案 0 :(得分: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,则会在skillListBizzare[skillChoice] 上抛出编译时错误。

答案 1 :(得分:0)

一种方法是:

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));
}

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

答案 2 :(得分:-1)

我认为你可以这样做:

interface Foo1 extends Foo {
  suma(): number
}

interface Foo{
  value1: number;
  value2: number;
}

http://www.typescriptlang.org/docs/handbook/interfaces.html#extending-interfaces

你添加这个:

  

我需要能够编写这样的函数:

function printFooSum(foo: Foo) {
  console.log(???);
}

但这部分不太清楚:

  

并且该函数不应涉及手动分配foo   其他类的属性。

你不想这样做吗?

function printFooSum(foo: Foo) {
  console.log(foo.value1 + foo.value2);
}