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 演示示例
