TypeScript函数重载

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

即使函数参数是不同types的,我也会得到一个编译器错误,指出重复的标识符 即使我将其他参数添加到第二个createFeatureLayer函数,我仍然得到一个编译器错误。 想法,请。

这可能是因为,当两个函数都编译成JavaScript时,它们的签名完全相同。 由于JavaScript没有types,我们最终创build了两个采用相同数量参数的函数。 所以,TypeScript限制了我们创build这样的function。

TypeScript支持基于参数数量的重载,但是如果我们比较OO语言的话,跟踪的步骤会有些不同。 在回答另一个SO问题时,有人用一个很好的例子来解释它: 方法重载?

基本上,我们正在做的是,我们正在创build一个函数和一些声明,所以TypeScript不会给编译错误。 当这段代码被编译成JavaScript时,只有具体的function才会被看到。 作为一个JavaScript函数可以通过传递多个参数来调用,它只是起作用。

在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开始,通常可以使用联合types删除对重载的需要。 上面的例子可以更好地表示使用:

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

a的types是“ stringnumber ”。

你可以声明一个重载的函数,声明该函数的types具有多个调用特征:

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

这里有趣的是, anyforms都被更具体的types覆盖所隐藏

 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 

作为一个正面对别人,我已经注意到,至less如由WebPack for Angular 2编译的TypeScript所显示的那样,您可以安静地使用overwrite而不是overLOADED方法。

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

呼叫:

 myComponent.method() 

似乎用参数执行方法,默默地忽略无参数的版本,输出:

 with arg 

我有类似的错误,当我从微软网站的TS教程工作。 我的解决scheme – 在VSCode中安装TSLint扩展。