Typescript 为什么可以';我不能用这种方式调用重载函数吗?

Typescript 为什么可以';我不能用这种方式调用重载函数吗?,typescript,overloading,Typescript,Overloading,以函数重载为例: function pickCard(x: {suit: string; card: number; }[]): number; function pickCard(x: number): {suit: string; card: number; }; function pickCard(x): any { /* ... */ } 在报告中说: 请注意,功能拾取卡(x):任何部件都不是 重载列表,因此它只有两个重载:一个重载接受对象 还有一个带数字的。使用任何其他参

以函数重载为例:

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
      /* ... */
}
在报告中说:

请注意,
功能拾取卡(x):任何
部件都不是 重载列表,因此它只有两个重载:一个重载接受对象 还有一个带数字的。使用任何其他参数调用pickCard 类型将导致错误

因此,我不能调用
pickCard(“test”)。它抛出了一个错误

如果
pickard(x)
不是有效的函数签名,那么我们为什么要编写它?有它在身边有什么好处?是否有我没有想到的用例


查看

前两个只是签名,以指定调用函数的不同选项

第三个是实际的函数定义,它只接收一个参数并返回任何参数。
在其中,您实现实际逻辑,检查函数接收到的类型,并根据传递的参数返回适当的值

例如:

function a(str: string): string;
function a(num: number): number;
function a(value: any): any {
    if (typeof value === "string") {
        return (parseInt(value) * 2).toString();
    } else {
        return value * 2;
    }
}

a("3"); // should be "6"
a(3); // should be 6
a(true); // error
您需要第三个签名,否则您将需要使用其他签名之一作为实际的函数定义。
如果选择第一个参数,则参数是字符串而不是数字;如果选择第二个参数,则参数是数字而不是字符串。
这就是为什么第三个参数在那里,它计算出传入的实际参数,并基于这些参数执行它的逻辑

您还可以拥有不同数量的属性:

function b(a: number): number;
function b(a: number, b: number): number;
function b(...args: number[]): any {
    if (args.length == 1) {
        ...
    } else {
        ...
    }
}
通常情况下,您将使用不同的签名,因为对于相同数量、不同类型的参数,您可以简单地:

function a(value: string | number): any {
    if (typeof value === "string") {
        return (parseInt(value) * 2).toString();
    } else {
        return value * 2;
    }
}

可能与您的问题有关。非常感谢您的提问和最后的奖金。