我在Type Script 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函数。
我想超载,我不知道该怎么办。
见下面的答案。

最佳答案

在挖掘之后,我发现我们可以做很多超载的事情。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并控制所有选项。
希望有帮助。

10-06 04:03