【问题标题】:Why can't I call an overloaded function in this manner?为什么我不能以这种方式调用重载函数?
【发布时间】:2016-04-20 14:07:34
【问题描述】:

以函数重载为例:

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
      /* ... */
}

在Handbook 中写道:

请注意,function pickCard(x): any 不是 重载列表,所以它只有两个重载:一个接受一个对象 一个需要一个数字。使用任何其他参数调用 pickCard 类型会导致错误。

因此我不能打电话给pickCard("test");。它会引发错误。

如果pickCard(x) 不是一个有效的函数签名,那我们为什么要写它呢?拥有它有什么好处?有没有我没有想到的用例?

查看playground example

【问题讨论】:

标签: typescript overloading


【解决方案1】:

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

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

例如:

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;
    }
}

【讨论】:

  • 非常感谢这个和最后的奖金。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
相关资源
最近更新 更多