混淆了打字稿中Interface的用法

时间:2016-02-01 21:33:15

标签: typescript

所有

我是打字稿的新手,当我尝试打字稿手册时,有两种类型(函数和类)接口定义:

对于功能,它说:

interface SearchFunc {
  (source: string, subString: string): boolean;
}

上课时,它说:

interface ClockInterface {
    currentTime: Date;
    setTime(d: Date);
}

class Clock implements ClockInterface  {
    currentTime: Date;
    setTime(d: Date) {
        this.currentTime = d;
    }
    constructor(h: number, m: number) { }
}

让我感到困惑的是:

为什么在界面内部有定义函数的差异方法,在函数类型部分中说:

  

为了描述带有接口的函数类型,我们给出了接口a   呼叫签名。这就像只有一个函数声明   给出的参数列表和返回类型。

为什么两者在定义函数时都有效?或者第二个(setTime(d:Date); part)不是函数定义?

由于

1 个答案:

答案 0 :(得分:0)

接口是描述实施实体必须实施的内容的合同。您在类接口中提供了一个函数签名,作为一种说法:“如果您正在实现此接口,那么您的类必须包含此函数并接受这些参数。

您展示的另一个界面是一个仅用于功能的整个界面。这样您就可以在接受SearchFunc接口的地方传递此函数。只要实现该接口的函数接受相同的参数类型(不需要是相同的变量名),就满足要求。

例如:

interface SearchFunc {
  (source: string, subString: string): boolean;
}

function doStuff (searchUtility: SearchFunc) {
  var contentExists = searchUtility(textToSearch, 'query text');
}

传递给doStuff的任何内容都需要遵守SearchFunc接口参数类型。 doStuff声明一个合同,上面写着“如果你给我一个函数,这就是它必须看的样子。它必须接受一串要搜索的文本,一串要查询的文本,并且它必须返回一个布尔值

doStuff(function (srcText: string, queryText: string) {
  return srcText.indexOf(queryText) !== -1;
}); 

合同中未指定实际执行搜索的函数中的逻辑。只接受哪些参数类型以及返回值应该是什么类型。

基本上,类接口允许您定义整个类的外观,包括该类的任何方法(方法是附加到对象的函数)。函数接口只是作为一种类型,以便其他一些API可以期望该类型,你必须满足它。如果所有这些假设的API都是一个看起来某种方式的函数,那么使它依赖于只包含一个函数定义的整个类就太过分了。