所有
我是TypeScript的新手,当我阅读有关函数重载的教程时,它给出了一个例子:
function add(arg1: string, arg2: string): string;
function add(arg1: number, arg2: number): number;
function add(arg1: boolean, arg2: boolean): boolean;
function add(arg1: any, arg2: any): any {
return arg1 + arg2;
}
console.log("add(1,1)=" + add(1, 1));
console.log("add(''1'',''1'')=" + add("1", "1"));
console.log("add(true,false)=" + add(true, false));
我的困惑是:
重载的一个目的是使用不同的函数体,但是这个例子似乎所有重载函数都必须共享一个相同的函数体,我想知道如何在Java中使用不同的函数体?
由于
答案 0 :(得分:3)
我想对Ryan的答案发表评论,但是它有相当的数量,所以我会尝试列出原因。确实,你只能得到一个功能体,但还有它的方法。
param:any
,那么如果你试图用一个实际上在该方法中不起作用的类型调用它,它就不会捕获错误。document.createElement
的函数时,这变得很有用,它返回大约50种不同的类型,具体取决于它的第一个参数。 ('div', 'span', 'video'
)2 的例子:
var num = 3;
var num2 = 2;
callMethodThatTakesStringParam(add(num, num2)); <-- argument error - can't
// assign a num to a string; it remembers the types, even though add has an overload
// that takes a string
3 的例子:
var x = document.createElement('video');
var y = document.createElement('div');
x.play();
y.play(); <-- type error, no such method
答案 1 :(得分:2)
在Java中,当您调用具有多个重载的函数时,编译器会确定您要调用的正文并调用该特定函数。考虑它的一个更好的方法是有多个具有相同名称的函数,编译器会自动消除歧义。
在TypeScript(和JavaScript)中,只有function.Types在编译时被擦除而在运行时不存在。这意味着唯一可能的重载类型是您可以在运行时自己确定对象的类型。这可能基于参数的数量,使用typeof
或instanceof
或其他一些数据。编译器不知道你打算如何区分不同的签名。
预期的模式是让函数体执行此选择过程 - 您将拥有以下内容:
function numberStringSwitch(x: string): number;
function numberStringSwitch(x: number): string;
function numberStringSwitch(x: any): any {
if (typeof x === 'string') {
return +x;
} else if(typeof x === 'number') {
return x.toString();
} else {
// null/undefined
return x;
}
}