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 回答
这可能是因为,当两个函数都编译为JavaScript时,它们的签名完全相同 . 由于JavaScript没有类型,我们最终会创建两个使用相同数量参数的函数 . 因此,TypeScript限制我们创建这样的函数 .
TypeScript支持基于参数数量的重载,但是如果我们与OO语言进行比较,则要遵循的步骤有点不同 . 在回答另一个SO问题时,有人用一个很好的例子解释了它:Method overloading? .
基本上,我们正在做的是,我们只创建一个函数和一些声明,以便TypeScript不会产生编译错误 . 当此代码编译为JavaScript时,单独的具体功能将是可见的 . 由于可以通过传递多个参数来调用JavaScript函数,因此它可以正常工作 .
在TypeScript中重载时,只有一个具有多个签名的实现 .
TypeScript只识别三个重载作为方法调用的可能签名,而不是实际的实现 .
在你的情况下,我个人会使用两个具有不同名称的方法,因为参数中没有足够的共性,这使得方法体可能需要有很多“ifs”来决定做什么 .
TypeScript 1.4
从TypeScript 1.4开始,通常可以使用union类型消除对重载的需要 . 上面的例子可以用以下方法更好地表达:
a
的类型是“string
或number
” .您可以通过将函数声明为具有多个调用签名的类型来声明重载函数:
然后是以下内容:
函数的实际定义必须是单数的,并在其参数内部执行适当的调度 .
例如,使用一个类(可以实现
IFoo
,但不必):这里有趣的是
any
表单被更具体的类型覆盖隐藏 .作为对其他人的反对,我已经观察到,至少由WebPack为Angular 2编译的TypeScript表明,你悄悄地得到overWRITTEN而不是overLOADED方法 .
呼叫:
似乎用参数执行方法,默默地忽略no-arg版本,输出: