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;
}
}
可能与您的问题有关。非常感谢您的提问和最后的奖金。