具有多个呼叫签名的TypeScript接口

时间:2017-04-17 18:44:42

标签: function typescript interface overloading

我在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 个答案:

答案 0 :(得分:2)

在挖掘它之后,我发现我们可以完成超载。 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并控制所有选项。

希望它有所帮助。