我正在阅读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
)?
答案 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} }。