混淆Typescript重载

时间:2015-12-18 17:55:23

标签: typescript overloading

所有

我是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中使用不同的函数体?

由于

2 个答案:

答案 0 :(得分:3)

我想对Ryan的答案发表评论,但是它有相当的数量,所以我会尝试列出原因。确实,你只能得到一个功能体,但还有它的方法。

  1. 调用该函数时,如果只有一个函数param:any,那么如果你试图用一个实际上在该方法中不起作用的类型调用它,它就不会捕获错误。
  2. 您可以使用不同的返回类型声明多个重载。 TypeScript会识别这些并适当地分配类型,即使JavaScript只是做同样的事情。
  3. Java可以做的一件事就是使用特定的字符串参数重载函数。当TypeScript输入类似document.createElement的函数时,这变得很有用,它返回大约50种不同的类型,具体取决于它的第一个参数。 ('div', 'span', 'video'
  4. 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在编译时被擦除而在运行时不存在。这意味着唯一可能的重载类型是您可以在运行时自己确定对象的类型。这可能基于参数的数量,使用typeofinstanceof或其他一些数据。编译器不知道你打算如何区分不同的签名。

预期的模式是让函数体执行此选择过程 - 您将拥有以下内容:

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