所有
我是打字稿的新手,当我尝试打字稿手册时,有两种类型(函数和类)接口定义:
对于功能,它说:
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)不是函数定义?
由于
答案 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都是一个看起来某种方式的函数,那么使它依赖于只包含一个函数定义的整个类就太过分了。