为什么可以在打字稿中为“接口”分配“功能”?

时间:2019-02-10 22:39:30

标签: javascript typescript function interface

我正在阅读Typescript Handbook - Generics,下面是一小段代码:

interface GenericIdentityFn {
    <T>(arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn = identity;

我想知道为什么要向类型为identity(为Function)的变量分配GenericIdentityFn(为Interface)?

2 个答案:

答案 0 :(得分:3)

当接口遵循此模式时:

interface Callable {
  (): any
}

据说实现此接口的任何东西都是可调用或具有呼叫签名。这是描述功能和方法的一种好方法。该符号还有其他变体:

interface GenericCallable<T> {
  (): T
}
interface Newable {
  new (): any
}
interface GenericNewable<T> {
  new (): T
}

其中带有new关键字的关键字是 newable ,这意味着它们使用new关键字(如类)进行调用。

您还可以同时拥有一个可调用 newable 的接口。标准库中内置的Date对象是其中之一:

interface DateConstructor {
    new(): Date;
    (): string;
}

长话短说,接口也可以描述功能,GenericIdentityFn是此类接口的示例。

答案 1 :(得分:1)

这是因为在Typescript中,您可以使用括号通过具有可调用签名的接口定义函数类型。

  

接口能够描述JavaScript对象可以采用的各种形状。接口除了可以描述具有属性的对象外,还可以描述函数类型。

有关此功能,请参见Typescript doc

在您的情况下,(req, res, next) =>identity定义的类型具有相同的签名,因为该接口定义了一个可调用签名,该签名采用GenericIdentityFn类型的参数并返回{{1} }。