首页 文章

TypeScript函数重载

提问于
浏览
188

TypeScript语言规范的第6.3节讨论了函数重载,并给出了如何实现它的具体示例 . 但是,如果我尝试这样的事情:

export class LayerFactory { 

    constructor (public styleFactory: Symbology.StyleFactory) { }

    createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {           
         throw "not implemented";
    }                 

    createFeatureLayer(layerName : string, style : any) : any {
        throw "not implemented";
     }        

}

即使函数参数属于不同类型,我也会收到指示重复标识符的编译器错误 . 即使我在第二个createFeatureLayer函数中添加了一个额外的参数,我仍然会遇到编译器错误 . 想法,请 .

4 回答

  • 38

    这可能是因为,当两个函数都编译为JavaScript时,它们的签名完全相同 . 由于JavaScript没有类型,我们最终会创建两个使用相同数量参数的函数 . 因此,TypeScript限制我们创建这样的函数 .

    TypeScript支持基于参数数量的重载,但是如果我们与OO语言进行比较,则要遵循的步骤有点不同 . 在回答另一个SO问题时,有人用一个很好的例子解释了它:Method overloading? .

    基本上,我们正在做的是,我们只创建一个函数和一些声明,以便TypeScript不会产生编译错误 . 当此代码编译为JavaScript时,单独的具体功能将是可见的 . 由于可以通过传递多个参数来调用JavaScript函数,因此它可以正常工作 .

  • 1

    在TypeScript中重载时,只有一个具有多个签名的实现 .

    class Foo {
        myMethod(a: string);
        myMethod(a: number);
        myMethod(a: number, b: string);
        myMethod(a: any, b?: string) {
            alert(a.toString());
        }
    }
    

    TypeScript只识别三个重载作为方法调用的可能签名,而不是实际的实现 .

    在你的情况下,我个人会使用两个具有不同名称的方法,因为参数中没有足够的共性,这使得方法体可能需要有很多“ifs”来决定做什么 .

    TypeScript 1.4

    从TypeScript 1.4开始,通常可以使用union类型消除对重载的需要 . 上面的例子可以用以下方法更好地表达:

    myMethod(a: string | number, b?: string) {
        alert(a.toString());
    }
    

    a 的类型是“ stringnumber ” .

  • 158

    您可以通过将函数声明为具有多个调用签名的类型来声明重载函数:

    interface IFoo
    {
        bar: {
            (s: string): number;
            (n: number): string;
        }
    }
    

    然后是以下内容:

    var foo1: IFoo = ...;
    
    var n: number = foo1.bar('baz');     // OK
    var s: string = foo1.bar(123);       // OK
    var a: number[] = foo1.bar([1,2,3]); // ERROR
    

    函数的实际定义必须是单数的,并在其参数内部执行适当的调度 .

    例如,使用一个类(可以实现 IFoo ,但不必):

    class Foo
    {
        public bar(s: string): number;
        public bar(n: number): string;
        public bar(arg: any): any 
        {
            if (typeof(arg) === 'number')
                return arg.toString();
            if (typeof(arg) === 'string')
                return arg.length;
        }
    }
    

    这里有趣的是 any 表单被更具体的类型覆盖隐藏 .

    var foo2: new Foo();
    
    var n: number = foo2.bar('baz');     // OK
    var s: string = foo2.bar(123);       // OK
    var a: number[] = foo2.bar([1,2,3]); // ERROR
    
  • 172

    作为对其他人的反对,我已经观察到,至少由WebPack为Angular 2编译的TypeScript表明,你悄悄地得到overWRITTEN而不是overLOADED方法 .

    myComponent {
      method(): { console.info("no args"); },
      method(arg): { console.info("with arg"); }
    }
    

    呼叫:

    myComponent.method()
    

    似乎用参数执行方法,默默地忽略no-arg版本,输出:

    with arg
    

相关问题