网站搜索

angular - TypeScript 接口可以扩展 Function 吗


学习 Angular 时,我遇到了以下声明:

interface IMessagesOperation extends Function {
(messages: Message[]): Message[];
}

这到底意味着什么(为什么 Function 首字母是大写 "F" 而不是简单的 function)。在这种情况下,我该如何实现具体类。我以前从未见过这种情况——我来自 Java 世界。

答案#1

可能有我没听说过的某种特定习语原因,但基本上这句话的意思是:IMessagesOperation 是一个具有所有常规 Function 特性的函数,它接受一个 Message 数组并返回一个 Message 数组,像这样:

type IMessagesOperation = (messages: Message[]) => Message[];

我不太清楚他们为什么没有那样写,除了接口可以被其他声明增强(参见这个和这个)。或者可能与类型别名(type)中使用 & 与接口(interface)中使用 extends 解决冲突的方式有关。

为了让你明白我所说的“通过其他声明增强”的意思,对于接口来说,可以在代码的其他地方这样做:

interface IMessagesOperation {
    (messages: string): Message[];
    //         ^^^^^^−−−−−− note the change
}

这会与您问题中的接口合并,产生一个函数重载类型,在该类型下这两种调用都是有效的:

const op: IMessagesOperation = /*...*/;
const messages1 = op("testing");
const messages2 = op(messages);

游乐场链接

你不能使用类型别名 (type IMessagesOperation=(messages: Message[]) => Message[];) 来做那件事。

为什么 Function 的首字母是大写的 "F",而不是只是 function

它指的是 JavaScript 的 Function 构造函数,尽管在那个特定情况下(因为它是类型上下文,而不是值 [运行时] 上下文),它指的是 Function 构造函数创建的东西的类型:一个函数。

在这种情况下我该如何实现具体类。

它是一个函数,不是一个类,所以你会写一个函数:

const m1: IMessagesOperation = function(messages: Message[]): Message[] {
    return messages;
};

上述内容的 Typescript 演示示例