具有多个调用签名的 TypeScript 接口

Posted

技术标签:

【中文标题】具有多个调用签名的 TypeScript 接口【英文标题】:TypeScript interface with multiple call signatures 【发布时间】:2017-09-13 10:15:19 【问题描述】:

我在 TypeScript 2.2 中看到了通过定义的接口调用签名“重载”函数的选项,我花了很长时间来了解如何使用它。

所以在处理它并“破解”它之后,我认为值得在这里发布它。

我开始的问题是,例如:

interface Func1 
    (num1: number, num2: number): number;
    (str1: number, str2: string): string;


function F1(num1: number, num2: number): number 
    return num1 + num2;


const f1: Func1 = F1;
console.log(f1(1, 2));

但是编译器没有通过它,因为Func1 不能接受F1 函数。

我想做重载,不知道怎么办。

请参阅下面的答案。

【问题讨论】:

【参考方案1】:

在挖掘它之后,我发现我们可以做相当多的重载。 TypeScript 中的重载与任何其他 javascript 代码没有什么不同。它必须在 一个 函数中实现,而不是在多个函数中实现,例如在 C++ 中。你需要让你的函数接受所有选项。

例如:

interface Func1 
    (v1: number, v2: number): number;
    (v1: string, v2: string): string;


const f1: Func1 = (v1, v2): any => 
    return v1 + v2;
;
console.log(f1("1", "2"));
console.log(f1(1, 2));

函数f1 假设重载接口调用签名的所有选项都有类型,如果设置强类型它将阻止你,因为类型不可转换。就像在这个例子中number 不能转换为string

您还可以创建多个使用接口调用签名重载的函数,并将它们传递给您的f1,如果类型匹配,它将通过。只需确保您的函数可以处理所有接口调用签名。

在使用类或函数参数不简单时检查实现函数的类型很重要,如上例,使用typeof 并控制所有选项。

希望对您有所帮助。

【讨论】:

typeof 仅对“简单”类型有意义。如果您这样做,请不要instanceof 检查您正在编写一个糟糕的 API。我可以并且会使用不是 instanceof 你的类的东西来调用你的 API,你将无法阻止它。 如果我想用不同的泛型参数进行重载怎么办?例如interface GenericIdentityFn <T>(arg: T): T; <T, F>(arg1: T, arg2: F): [T, F]; @FindOutIslamNow 多个同名接口默认合并,它们的泛型也是如此(也按名称)。 interface I<A>, interface I<A,B>, interface I<C> == interface I<A,B,C>. "运算符 '+' 不能应用于类型 'string | number' 和 'string | number'。"

以上是关于具有多个调用签名的 TypeScript 接口的主要内容,如果未能解决你的问题,请参考以下文章

如何创建具有索引签名和不同类型的固定属性的 TypeScript 接口?

Typescript - 具有通用类型函数的索引签名

如何让一个类在 Typescript 中实现调用签名?

Typescript 从具有泛型类型的对象索引调用函数

使用裸函数签名和其他字段实现 TypeScript 接口

创建一个具有可变长度数组的接口,其中包含 TypeScript/Angular4 中的对象