为什么我不能以这种方式调用重载函数?
Why can't I call an overloaded function in this manner?
以函数重载为例:
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
/* ... */
}
在 Handbook 中说:
Note that the function pickCard(x): any
piece is not part of the
overload list, so it only has two overloads: one that takes an object
and one that takes a number. Calling pickCard with any other parameter
types would cause an error.
因此我无法调用 pickCard("test");
。它会引发错误。
如果pickCard(x)
不是有效的函数签名,那我们为什么要写呢?随身携带有什么好处?有没有我没有想到的用例?
前两个只是签名,用于指定调用函数的不同选项。
第三个是实际的函数定义,它只接收一个参数和return任何一个。
在其中实现实际逻辑,检查函数接收到的类型是什么,并根据传递的参数 return 适当的值。
例如:
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;
}
}
以函数重载为例:
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
/* ... */
}
在 Handbook 中说:
Note that the
function pickCard(x): any
piece is not part of the overload list, so it only has two overloads: one that takes an object and one that takes a number. Calling pickCard with any other parameter types would cause an error.
因此我无法调用 pickCard("test");
。它会引发错误。
如果pickCard(x)
不是有效的函数签名,那我们为什么要写呢?随身携带有什么好处?有没有我没有想到的用例?
前两个只是签名,用于指定调用函数的不同选项。
第三个是实际的函数定义,它只接收一个参数和return任何一个。
在其中实现实际逻辑,检查函数接收到的类型是什么,并根据传递的参数 return 适当的值。
例如:
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;
}
}