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函数中添加了一个额外的参数,我仍然会得到一个编译器错误。请给我点子。
发布于 2012-11-04 03:49:30
这可能是因为,当两个函数编译成JavaScript时,它们的签名完全相同。由于JavaScript没有类型,我们最终创建了两个带有相同数量参数的函数。因此,TypeScript限制了我们创建这样的函数。
TypeScript支持基于参数数量的重载,但如果我们将其与OO语言进行比较,则需要遵循的步骤略有不同。在回答另一个SO问题时,有人用一个很好的例子解释了它:Method overloading?。
基本上,我们正在做的是,我们只创建了一个函数和许多声明,这样TypeScript就不会给出编译错误。当这段代码编译成JavaScript时,具体的函数就可见了。因为可以通过传递多个参数来调用JavaScript函数,所以它可以正常工作。
发布于 2012-11-04 03:50:31
在TypeScript中重载时,只有一个具有多个签名的实现。
class Foo {
myMethod(a: string);
myMethod(a: number);
myMethod(a: number, b: string);
myMethod(a: any, b?: string) {
alert(a.toString());
}
}
只有这三个重载被TypeScript识别为方法调用的可能签名,而不是实际的实现。
在您的例子中,我个人会使用两个不同名称的方法,因为参数中没有足够的通用性,这使得方法体可能需要有很多“if”来决定要做什么。
TypeScript 1.4
从TypeScript 1.4开始,通常可以使用联合类型消除对重载的需求。使用以下命令可以更好地表达上面的示例:
myMethod(a: string | number, b?: string) {
alert(a.toString());
}
a
的类型为“string
或number
”。
发布于 2016-10-03 22:57:19
作为对其他人的提醒,我已经注意到,至少像WebPack为Angular 2编译的TypeScript所显示的那样,您得到的是overWRITTEN方法,而不是overLOADED方法。
myComponent {
method(): { console.info("no args"); },
method(arg): { console.info("with arg"); }
}
呼叫:
myComponent.method()
似乎执行带有参数的方法,默默忽略无参数版本,并输出:
with arg
https://stackoverflow.com/questions/13212625
复制相似问题