以功能重载为例:
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
部分不属于。{1}} 重载列表,因此它只有两个重载:一个接受一个对象 和一个需要一个数字。使用任何其他参数调用pickCard 类型会导致错误。
因此我无法致电pickCard("test");
。它会引发错误。
如果pickCard(x)
不是有效的函数签名,那么为什么我们必须编写它?拥有它的好处是什么?是否有一个我没想到的用例?
答案 0 :(得分:2)
前两个只是签名,用于指定调用该函数的不同选项。
第三个是实际的函数定义,它只接收一个参数并返回任何参数。
在其中,您实现了实际的逻辑,检查函数接收的类型是什么,并根据传递的参数返回适当的值。
例如:
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;
}
}